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 :

[java] Exercice d'examen


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut [java] Exercice d'examen
    Bonsoir,

    voici un exercice d'examen, il y a quelque point que je n'est pas saisie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface I{
        public void f();
        public void g(int n);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface J{
        public void g(int n);
        public int h(int n);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class A{
        private int moi;
        public A(int moi){this.moi=moi;}
        public int getMoi(){return moi;}
        public int f(int n){
    	moi+=n;
    	System.out.println("A"+moi);
    	return moi;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class B extends A implements J{
        private static int cptB;
        public B(int moi){
    	super(2*moi);
    	cptB++;
        }
        public void g(int n){System.out.println("B"+n+"-"+cptB);}
        public int h(int n){
    	int moi=getMoi();
    	System.out.println("B"+(moi+n));
    	return moi;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class C extends A{
        public C(int moi){super(moi);}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class D extends B implements I{
        private int nb;
        public D(int moi,int nb){super(moi);this.nb=nb;}
        public void f(){
    	f(nb);
    	System.out.println("D"+nb);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class E extends C implements I{
        public E(int moi){super(moi);}
        public void f(){System.out.println("E"+f(3));}
        public void g(int n){
     
        }
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class Test2{
        public static void main(String[] args){
    	A a=new A(5);
    	A d1=new D(8,2);
    	B b1=new B(6);
    	C c1=new C(7);
    	D d2=new D(2,4);
    	System.out.println(a.f(2));
    	c1.f(2);
    	d2.f();
    	d2.g(3);
    	b1.g(2);
    	b1.h(4);
        }
    }

    alors dans l'exercice il faut dire si il y d'abord des erreurs dans le programme ensuite dire ce qu'il se passe pour chaque instruction dans le main (si erreur corrigé etc)

    ma première question:
    pourquoi D qui implements I compile sans erreur alors que E qui implements I ne compile pas sans la méthode g ?
    quand on implements une interface il faut utiliser toutes les méthodes de l'interface alors pourquoi sa compile??

    seconde question:
    A d1=new D(8,2); pourquoi sa compile sans erreur alors que A est la classe mère de D, elle ne possède donc pas toutes les méthodes de D (il n'y a que D qui hérite des méthodes de la classe A)

    dernière question:
    d2.g(3) donne B3-3 cptB est static c'est à dire que la variable gardera la valeur de chaque instance du même type: (la variable évolue)
    alors pourquoi : b1.g(2) donne B2-3 ? et non B2-4 !


    Merci d'avance pour votre aide !

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    pourquoi D qui implements I compile sans erreur alors que E qui implements I ne compile pas sans la méthode g ?
    car g() est une methode declaree dans l'interface ce qui signifie que n'importe quelle classe implementant 'interface specifique doit implementer ses fonctions

    quand on implements une interface il faut utiliser toutes les méthodes de l'interface alors pourquoi sa compile??
    quand on implemente une interface il faut definier toutes les methodes de l'interface

    A d1=new D(8,2); pourquoi sa compile sans erreur alors que A est la classe mère de D, elle ne possède donc pas toutes les méthodes de D (il n'y a que D qui hérite des méthodes de la classe A)
    ceci est du a l'heritage il ffaut comprendre comme ceci: une classe fille est une classe mere mais pas l'inverse.

    d2.g(3) donne B3-3 cptB est static c'est à dire que la variable gardera la valeur de chaque instance du même type: (la variable évolue)
    alors pourquoi : b1.g(2) donne B2-3 ? et non B2-4 !
    static dans ce cas ci signifie qu'il n'y a qu'une seule instance de la variable commune a tous les instances de cette classe. comme tu as instancie 3 classes B c'est normal d'avoir comme resultat 3 . cependant il 'est mieux d'initialiser ses variables 0,null, ou autres.

  3. #3
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Citation Envoyé par adrien1 Voir le message
    ceci est du a l'heritage il ffaut comprendre comme ceci: une classe mere est une classe fille mais pas l'inverse.


    C'est pas en disant des énormités pareilles qu'il va comprendre.
    Une classe "fille" est une classe "mere" et pas l'inverse !!!

    A est la super classe (mère) de B et B est la supe rclasse (mère) de D.
    donc A est une super classe de D (par transitivité)
    D est une sous classe (fille) de B et B est une sous classe (fille) de A
    donc D est une sous classe de A (par transitivité)

    On dit que D est un B, D est un A
    On dit que B est un A
    On dit que E est un C, E est un A
    On dit que C est un A

    L'inverse n'est pas vrai !


    On peut parler d'héritage par analogie avec les arbres généalogique :
    A
    B C
    D E

    Quand tu montes, c'est les parents.
    Quand du descend, c'est les enfants.

    Vers le haut, c'est l'abstraction, la généralisation.
    Vers le bas, c'est le concret, la spécialisation.

    Les classes du bas reçoivent (hérites) des méthodes de leur parents, en plus des leurs, elles en ont donc plus.

    Un conseil : fais toi un petit dessin, tu visualiseras mieux.
    Les interfaces, c'est un contrat qui doit être respecté par une classe qui implémente l'interface. La classe qui implémente une interface doit avoir les méthodes de l'interface.
    Si la classe est abstraite, elle peut ne pas implémenter une des méthode de l'interface mais ça sera à une de ses classes filles de l'implémenter ! (Les enfants règlent les contrats des parents)
    Au final, la sous classe la plus en bas sera une classe concrete qui aura toutes les méthodes de l'interface (que ce soit à son niveau ou dans ses parents)

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    Citation Envoyé par benwit Voir le message


    C'est pas en disant des énormités pareilles qu'il va comprendre.
    Une classe "fille" est une classe "mere" et pas l'inverse !!!
    Olala je viens de m'en rendre compte c'est vrai que j'ai dit une fameuse bêtise là .
    Avec toute mes excuses. désolé. Je m'en vais directement edite mon post pour effacer cette vilaine crasse que j'ai mis. Honte sur moi


    En tout cas. en ce qui me concerne j'ai en general pas trop de mal pour comprendre les choses mais pour les faire comprendre aux autres ca a toujours été un peu plus difficile.
    De plus si je me mets a debiter des énormites. je suis vraiment géné. Mea culpa

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    ok si j'ai comprit déclarer B b1=new B(2); reviens au même que déclarer A b1=new B(2);
    rien ne différre des 2 instanciations (si non quel sont les changements dans l'exemple cité)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    d2.g(3) donne B3-3 cptB est static c'est à dire que la variable gardera la valeur de chaque instance du même type: (la variable évolue)
    alors pourquoi : b1.g(2) donne B2-3 ? et non B2-4 !

    je ne comprend vraiment pas cette partie, d'ailleurs je n'est pas bien saisie la déclaration static d'un variable ou méthode static avec mes cours !

    pour moi le seul intérêt est qu'une variable static garde sa valeur par exemple si j'ai une instance A a1=new A() avec une classe A comprenant une variable static cpt avec le calcul cpt++ lorsqu'on va faire une autre instance A a2=new A() la variable cpt va garder la valeur de la première instance donc cpt=2

  7. #7
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Citation Envoyé par Delnir Voir le message
    ok si j'ai comprit déclarer B b1=new B(2); reviens au même que déclarer A b1=new B(2);
    rien ne différre des 2 instanciations (si non quel sont les changements dans l'exemple cité)
    Dans les deux cas, tu crées un objet B.

    Si la variable b1 est déclaré de type B, tu peux appeler toutes les méthodes publiques de ton objet B (celle de A et celle de B)

    Si la variable b1 est déclaré de type A, tu ne peux appeler que les méthodes de A (sinon, il faut caster avec (B) pour appeler celles spécifiques à B)
    C'est d'ailleurs une bonne habitude d'utiliser la classe la plus abstraite/ou l'interface comme type de variable si on n'envisage d'utiliser que les méthodes les plus générales.

    Par exemple, tu as l'interface List qui a des méthodes pour ajouter, enlever, récupérer des éléments... Il y a plusieurs implémentations possibles comme ArrayList, LinkedList, ... qui implémentent cette interface à leur façon (elles doivent juste respecter le contrat et avoir les méthodes définis dans List) et qui ont des méthodes qui leur sont propres.

    Ainsi en général, il est préférable d'écrire :
    List l = new ArrayList();
    que
    ArrayList l = new ArrayList();

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Exercice 2:
    On désire, pour un logiciel de dessin vectoriel, sauvegarder un dessin constitué de figures géométriques (disque carré, rectangle). pour chacune de ces figures, on veut:

    -connaître son périmètre et son aire;
    -pouvoir afficher ses caractéristiques(coordonnées du point d'origine,diamètre ou dimension des côtés, sa couleur)
    -si on lui transmet un composant graphique de type java.awt.Canvas, la figure géométrique doit se dessiner sur le canvas.

    Q1.Définissez en java une figure géométrique répondant au cahier des charges;
    Q2.Proposez une implémentation complète dans le cas d'un carré(sauf pour la fonctionnalité de dessin).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    pour la première question tu répète exactement ce que j'ai dit, mais je vien de comprendre c'est parce que D extends B donc il possède bien ma méthode g contrairement à E

    pour la seconde question ok j'ai comprit merci, je note ce que j'ai fait pour l'exercice 2 et j'ai quelque question ensuite

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    Pour l'exercice 2 on ne fournit pas du tout fait expose ton probleme, presente tes solutions et on te conseillera

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Delnir Voir le message
    pour la première question tu répète exactement ce que j'ai dit, mais je vien de comprendre c'est parce que D extends B donc il possède bien ma méthode g contrairement à E)
    je te mets sur la piste, je ne règle pas ton probleme. On a bien plus de satisfaction a trouver la solution a son probleme soi-même que quand c'est quelqu'un d'autre.
    Mais n'hesite surtout pas a poser des question quand tu ne comprends pas quelque chose. on se fera un plaisir de t'aider a comprendre.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    voilà ce que j'ai fait pour l'exercice 2 c'est correcte?

    -si on lui transmet un composant graphique de type java.awt.Canvas, la figure géométrique doit se dessiner sur le canvas.
    Sa jamais vu, je ne sait absolument pas ce qu'il faut faire !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class FigureGeometrique{
        protected String couleur;
        protected int xOrigine, yOrigine;
     
        public FigureGeometrique(String couleur,int xOrigine,int yOrigine){
    	this.couleur=couleur;
    	this.xOrigine=xOrigine;
    	this.yOrigine=yOrigine;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public interface Icarre{
     
        public Carre(String couleur,int xOrigine,int yOrigine,int dimensionCotes);
     
     
        public int aire();
     
     
        public int perimetre();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     public class Carre implements Icarre{
     
        private int dimensionCotes;
        public Carre(String ouleur,int xOrigine,int yOrigine,int dimensionCotes){
    	super(couleur,xOrigine,yOrigine);
    	this.dimensionCotes=dimensionCotes;
        }
     
        public int aire(){
    	return (dimensionCotes*dimensionCotes);
        }
     
        public int perimetre(){
    	return(4*dimensionCotes);
        }
     
    }
    merci d'avance pour votre aide.

Discussions similaires

  1. problème java exercice et complexité
    Par baobab95 dans le forum Débuter avec Java
    Réponses: 20
    Dernier message: 14/06/2009, 14h40
  2. [SimpleXML] Résolution d'un exercice d'examen de XML
    Par setsuko974 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/07/2007, 22h27
  3. débutant en java(exercice)
    Par hammouch dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2007, 10h35
  4. [Java] Examen de la certification Sun
    Par chady dans le forum Certifications
    Réponses: 8
    Dernier message: 23/12/2004, 14h11

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