IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Quizz Java - Explication sur le corrigé


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 35
    Par défaut Quizz Java - Explication sur le corrigé
    Bonjour!


    Je me prépare à passer un test de développeur junior. Et parmi les éléments demandés il faut:

    Java
    C#
    PHP
    etc.

    C'est ainsi que je me prépare en prenant ça et là des QCM.

    Sur une série de QCM on pose les questions suivantes:

    Question 1
    : Pour la classe C définies comme suit (vous pouvez voir mes questions en commentaires dans le code):

    class C {
    public static int i;
    public int j;

    public C(){i++; j=i;} // Quelle est la valeur par défaut de i et j ??
    }

    qu'affichera le code suivant?

    C x = new C();
    C y = new C();
    C z = x; // Ceci est un objet du type C. Mais qu'est-ce que
    // ca veut dire au juste?? Et si je faisait ça z = x??

    System.out.println(z.i + " et " + z.j); // Réponse proposée: 2 et 1


    Question 2: Pour les classes Machin et Bidul définies comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Machin {
       public int f() {return (5);}
       public static int g() {return (6);}
    }
     
    class Bidul extends Machin{
       public int f() {return (2);}
       public static int g() {return (4);}
    }
    //Réponse 12 comment?? Moi je trouve 8
    Qu'affichera le code suivant?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bidoul b = new Bidoul(); Machin m = b;
    System.out.println(m.f()*m.g();
    Je mettrai à jour au cas de besoin

    ps: si vous avez d'autres exos à me recommander, je suis preneur (java, c#, php)

  2. #2
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Manifestement, tu devrais plutôt t'orienter vers des cours de base (tu peux en trouver sur ce site) plutôt que des exercices, ces questions étant niveau étudiant débutant.

    Il te manque les notions les plus élémentaires.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 35
    Par défaut
    Il semble que tu ne m'aies pas bien compris; et c'est normal!

    Je ne sais pas à quoi tu fait référence en disant notions de base. Pour ton info, les qcm ont parfois (je dirai même souvent) des pièges que même un bac + 100 en Java ou autre peut tomber.

    Mes questions sont en commentaires dans le code si tu ne les a pas vues.

    Merci d'avoir pu lire mon post

  4. #4
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    J'ai bien compris, et ces questions ne sont pas des pièges, elles sont très simples à résoudre pour quiconque connait la base du language(ce qu'est un objet, valeur par défaut des objets, des litterals, notion de static, affectation,...).

    J'ai bien vu tes questions dans les commentaires, et c'est un bac + 0 qui te dit ça.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 35
    Par défaut
    Merci!

    Et si tu en répondais le plus simplement!!!

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par Bam92 Voir le message
    Et si tu en répondais le plus simplement!!!
    Et donc où sont les réponses que tu proposes à ces QCM ? De plus, où bloques tu, tu ne l'as pas précisé dans tes interventions.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Citation Envoyé par Bam92 Voir le message
    // Quelle est la valeur par défaut de i et j ??
    Java initialise toutes les variables membres à une valeur qui est décidée par leur type.
    Pour les types primitifs numériques comme int, cette valeur est zéro.

    Citation Envoyé par Bam92 Voir le message
    C z = x; // Ceci est un objet du type C. Mais qu'est-ce que
    // ca veut dire au juste?? Et si je faisait ça z = x??
    Si tu fais z = x; alors z ne correspond à rien et ça ne compilera tout simplement pas.

    C z = x; déclare une nouvelle variable, nommée z et de type C. Ensuite il assigne une valeur à cette variable z.
    En l'occurrence C est un type objet, donc les variables de type C pointent vers des objets. Ici on dit à z de pointer vers le même objet que x.

    Citation Envoyé par Bam92 Voir le message
    // Réponse proposée: 2 et 1
    Oui. i est une variable statique, donc sa valeur ne dépend pas d'instance particulière de C.
    Sa valeur est affectée à chaque fois qu'on passe dans le constructeur de C.
    Le code provoque deux fois new C() donc deux fois le constructeur de C.
    Le constructeur incrémente la valeur de i.
    i étant initialisée sans valeur explicite, elle commence à 0. En étant incrémentée deux fois, sa valeur passe à 2.

    j est une variable d'instance, normale, pas statique. Toutes les instances de C ont leur propre valeur de j qu'elles maintiennent elles-mêmes.
    En l'occurrence nous nous intéressons à l'instance pointée par z, qui est la même que celle pointée par x, qui est construite avec new C() et n'a pas été touchée depuis.
    Le constructeur dit que j est initialisée à la valeur en cours de i.
    Comme vu au-dessus, la valeur de i est modifiée à chaque appel du constructeur de C.
    L'instance pointée par x et z, est celle créée en premier, lors du premier appel du constructeur. A ce moment-là, i n'avait pas encore changé de valeur et valait zéro. Le constructeur incrémente i, qui vaut 1. Puis il donne à j la valeur courante de i, donc 1.

    Citation Envoyé par Bam92 Voir le message
    //Réponse 12 comment?? Moi je trouve 8
    Tu n'as sans doute pas remarqué que la méthode g() est statique.
    Ce n'est pas une méthode d'instance mais de classe, il n'y s'applique donc pas le polymorphisme, ou si tu préfères la redéfinition de méthodes.
    Contrairement aux méthodes d'instance qui sont redéfinies quand une sous-classe définit une méthode de même nom et de même signature, les méthodes de classe ne sont jamais redéfinies, et si une sous-classe en propose une de même nom et même signature, cela définit juste une nouvelle méthode sans lien avec la précédente. C'est juste que comme elles ont le même nom, la sous-classe Bidul, lorsqu'on lui parle de g(), pensera d'abord à sa propre méthode g() plutôt qu'à la méthode g() de sa classe mère. Normal.

    Mais puisque g() est une méthode de classe et pas d'instance, écrire quelque chose comme m.g() n'est pas propre.
    C'est accepté en Java, mais ça ne devrait pas l'être, et n'importe quel compilateur digne de ce nom te donnera un avertissement si tu le fais.
    Ce que signifie en réalité m.g(), c'est Machin.g(). On le sait parce que la variable m a été déclarée Machin m, donc de type Machin. Par conséquent la méthode statique g() que l'on cherche à appeler, est la méthode g() de la classe Machin.

    f() par contre, est une méthode d'instance, et écrire m.f() est parfaitement d'usage. S'y applique les règles habituelles du polymorphisme, et donc puisque la variable m pointe vers un objet qui est de type Bidul, il y a vérification à chaud de quelle est l'implémentation de la méthode f() pour la classe Bidul. Bidul redéfinit f(), donc Bidul.f() est appelée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 35
    Par défaut
    Merci infiniment pour votre réponse. Vous avez répondu exactement comme le corrigé et un peu plus d'ailleurs. On dirait que c'était vous qui aviez posé ces questions.

    Mais il y a toujours quelque chose qui me fait gratter la tête. On dit que m est de type Machin lorsqu'il s'agit de m.g(). Et quand il s'agit de m.f(), il de vient de type Bidul. Que comprendre concrètement? ou mieux quelle astuce voir pour bien en déduire le type dans le contexte présent.

    Merci d'avance

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Concrètement ce qu'il faut comprendre, c'est qu'il faut pendre les gens qui écriraient m.g().
    Je l'ai déjà dit, c'est malheureusement autorisé en Java, mais ça ne devrait pas et n'importe quel compilateur t'engueulera copieusement si tu le fais.
    Ce qu'il faut comprendre, c'est que le mieux c'est qu'une chose pareille n'existe pas, et ne pas se demander ce qui se passe puisque ça ne se passe pas.

    Ce n'est pas m.g() qu'on écrit, c'est Machin.g(). Point final.

    L'astuce, c'est de constater que g() est une méthode statique et donc si on écrit m.g() on est un blaireau.
    Quant à l'astuce pour répondre correctement, c'est de se rappeler ce qu'aurait écrit quelqu'un qui n'est pas un blaireau. La variable m est déclarée Machin m, donc quelqu'un qui n'est pas un blaireau aurait écrit Machin.g(). Même type que ce qui a été écrit pour déclarer la variable.
    C'est tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 35
    Par défaut
    Très bien compris.

    ps: n'avez vous pas d'autres qcm d'entrenement?

Discussions similaires

  1. Explications sur un code Java
    Par while.dede dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/04/2015, 17h05
  2. Quizz Java/J2EE corrigé
    Par yahya.romdhane.ensi dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 23/07/2013, 11h47
  3. Réponses: 1
    Dernier message: 22/11/2006, 16h33
  4. Réponses: 28
    Dernier message: 18/08/2003, 11h54
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo