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 :

Classe qui ne s'initialise pas


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut Classe qui ne s'initialise pas
    Bonjour !

    Je m'entraine sur Java pour les rattrapages qui sont dans quelques jours, et décidément j'ai toujours du mal a comprendre la logique de ce langage ...

    C'est un petit exo ou je dois creer une classe Point, puis une classe Segment.

    La classe Point:

    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
    18
    19
    20
    public class Point {
     
        private double x=0,y=0;
     
        public void Val(double xVal,double yVal){
            this.x=xVal;
            this.y=yVal;
        }
     
        public double getX(){
            //System.out.println(this.x);
            return this.x;
        }
     
        public double getY(){
            //System.out.println(this.y);
            return this.y;
        }
     
    }
    La classe segment

    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 Segment {
     
        private Point p1,p2;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    Lorsque je créer un point, il est bien initialisé directement par x=0 et y=0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Point B = new Point();
    System.out.println(B.getX());
    me donne bien 0.0

    Pourtant lorsque je crée un segment, les deux points ne s'initialise pas avec (0,0) ! Je ne comprend pas pourquoi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Segment S = new Segment();
    System.out.println(S.getPoint1().getX());
    me donne NullPointerException !

    Même si je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Segment S = new Segment();
    System.out.println(S.getPoint1());
    Ca me donne Null.

    Pourquoi ma classe segment de crée-t-elle pas directement des points de valeur (0.0) ??

    Si vous avez une idée, un grand merci

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Salut,
    C'est parcequ'il nya pas d'initialisation par defaut dans ta classe

    Eric

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Pour être plus précis, en Java un objet ne se crée qu'en faisant un new.

    Si tu veux que ta classe Segment crée des objets Point, tu dois faire des new Point(). Par défaut, aucun objet n'est créé et les variables sont donc null.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord du coup j'ai modifier ma classe Segment

    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
    18
    19
    public class Segment {
     
        Point p0 = new Point();
     
        private Point p1=this.p0,p2=this.p0;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    Et ça fonctionne ! Mais je ne comprend pas, ma classe segment crée 2 points p1 et p2 d'après la classe point, alors pourquoi j'avais (0,0) lorsque je test la classe point, et "Null" lorsque je test la classe Segment ?

    Décidément je trouve java assez obscure dans sa façon de fonctionner ...

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord. Du coup un objet n'existe qu'après un new ... Donc une classe peut fonctionner avec des constructeurs "null" ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,


    Citation Envoyé par Xx-Astro Voir le message
    Et ça fonctionne ! Mais je ne comprend pas, ma classe segment crée 2 points p1 et p2 d'après la classe point, alors pourquoi j'avais (0,0) lorsque je test la classe point, et "Null" lorsque je test la classe Segment ?
    C'est parce que private Point p1, p2; ne fait que déclarer 2 variables p1 et p2 de type Point, mais ne créé aucun objet. Par défaut, une variable déclarée de type classe est initialisée à null (les variables de type primitif sont initialisées avec une valeur). C'est tout, c'est comme ça. C'est comme ajouter un numéro à une rue : il n'y a pas de maison qui apparait comme par magie toute seule, il faut en construire une.

    Accessoirement, ton code pourrait s'écrire :
    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 Segment {
     
        private Point p1=new Point(), p2=p1;
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
    }
    ça t'évite de créer un attribut p0 qui ne sert à rien.


    Citation Envoyé par Xx-Astro Voir le message
    Donc une classe peut fonctionner avec des constructeurs "null" ?
    On dit plutôt constructeur "vide", voir implicite ("vide" forcément).

    Constructeur vide implicite (on ne voit pas de constructeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Machin {
        private String string;
    }
    Constructeur vide explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Truc {
        private String string;
        public Truc() {
        }
    }
    Quant à fonctionner, ça dépend. On peut faire une classe avec des attributs non initialisés. Mais elle peut ne pas fonctionner s'il y a du code qui essaye de faire quelque chose avec ses attributs non initialisés.

    La classe suivante ne pourra être instanciée :

    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
    18
    public class NonInstanciable {
     
        private String string;
    	private int nombreDeMots;
     
       public NonInstanciable() {
          nombreDeMots = string.split("\\s+").length;
       }
     
       public String getString() {
           return string;
       }
     
       public int getNombreDeMots() {
          return nombreDeMots;
       }
     
    }
    Parce que string n'est pas initialisée, elle vaut null. Donc quand on appelle split() sur string, on obtient une NullPointerException.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'accord, je vois.

    Alors j'ai modifié a nouveau mon code pour mettre des constructeurs a chaque fois.
    La classe Point fonctionne. La classe segment fonctionne aussi, sauf si je remplace le contenu du constructeur par ce qui est en commentaire ... Ca me donne encore un "NullPointerException"

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Point {
     
        public double x,y;
     
        public Point(){
            this.x=0;
            this.y=0;
        }
     
        public void setPoint(double xVal,double yVal){
            this.x=xVal;
            this.y=yVal;
        }
     
        public double getX(){
            return this.x;
        }
     
        public double getY(){
            return this.y;
        }
     
        public double getDistance(Point p1){
            return Math.sqrt(Math.pow((this.x-p1.getX()), 2)+Math.pow((this.y-p1.getY()), 2));
        }
    }
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class Segment {
     
        public Point p1, p2;
     
        public Segment(){
            Point p0=new Point();
            this.p1 = p0;
            this.p2 = p0;
    //        this.p1.setPoint(0,0);
    //        this.p2.setPoint(0,0);
        }
     
        public Point getPoint1(){
            return p1;
        }
     
        public Point getPoint2(){
            return p2;
        }
     
        public void setPoints(Point p1, Point p2){
            this.p1 = p1;
            this.p2 = p2;
        }
     
        public void affichage(){
            System.out.println("1er point: " + "x=" + this.p1.getX() + "  " + "y=" + this.p1.getY());
            System.out.println("2eme point: " + "x=" + this.p2.getX() + "  " + "y=" + this.p2.getY());
        }
     
        public double getLongueur(){
            return this.p1.getDistance(this.p2);
        }
    }
    Mais pourquoi ? Les trois lignes de codes, et les deux en commentaire m'ont l'air équivalente !

    PS: j'ai tout passé en public car je ne savait d'ou venait l'erreur ... Je modifiais ça après.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    Ah ok je viens de comprendre en postant ... p1 et p2 n'existent pas tant qu'il n'y a pas de new ... Mais alors pour quoi je peux utiliser x et y dans la classe Point sans faire de new ??!

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Xx-Astro Voir le message
    Ah ok je viens de comprendre en postant ... p1 et p2 n'existent pas tant qu'il n'y a pas de new ... Mais alors pour quoi je peux utiliser x et y dans la classe Point sans faire de new ??!
    Oui, enfin, ce n'est même pas que tu ne peux pas utiliser x et y des l'instances de Point référencées par p1 et p2 parce qu'elles n'existent pas tant que tu n'as pas crée ces instances (par new).

    Considère la classe comme un descripteur : une sorte de plan. L'instance c'est le machin concrèt établi d'après ces plans. Tu peux faire des plans très précis d'une voiture ou d'une maison, ni la voiture, ni la maison n'existeront tant qu'on ne les auras pas fabriquée ou construite. En outre, on peut fabriquer plusieurs voitures d'après les mêmes plans, ou plusieurs maisons d'après les mêmes plans : elles se ressemblent en tout point (les mêmes caractéristiques techniques), mais ce sont pas les mêmes. C'est ici qu'on parle d'instances : chaque voiture fabriquée d'après le même plan est une instance de ce plan. Et on ne peut pas changer les roues, ou mettre de l'essence dans une voiture qui n'existe pas encore, même s'il y a des roues, des essieux..., et un réservoir prévus sur les plans. De la même façon, si les plans de la voiture disent qu'elle est fabriquée de base sans jantes, il faudra en installer avant de pouvoir monter des pneus dessus. C'était le cas de ton segment : sans points de base, on ne pouvait en changer leur coordonnées.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    Ouai j'avais assez bien compris l'histoire de "plan de construction". Ce qui me gène le plus c'est de créer des variables qui ne sont utilisables qu'après un new.

    Mes études se concentre plus sur la programmation de microcontrôleurs en C. Et je trouve que Java est vraiment éloigné de la réalité du matériel, du coup j'ai un peu de mal à comprendre les subtilités du langage !

    Bon en tout cas j'avance ... Maintenant je me lance dans les classes abstraites !

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par Xx-Astro Voir le message
    Ah ok je viens de comprendre en postant ... p1 et p2 n'existent pas tant qu'il n'y a pas de new ... Mais alors pour quoi je peux utiliser x et y dans la classe Point sans faire de new ??!
    Ce ne sont pas des objets, ce sont des double, l'un des types de base.
    Les objets doivent être créés pour exister, mais ce n'est pas le cas des types de base. Ils sont créés dès lors que l'objet qui les contient est créé. Ou pour les variables locales, ils sont créés dès lors qu'on leur assigne une valeur.

    La cohérence de la chose, est au niveau des variables. Toute variable est créée dès que l'objet qui la contient est créé, qu'elle soit de type objet ou de base. Elle est d'abord créée avec une valeur par défaut. Pour les objets, cette valeur par défaut est null, pour les nombres c'est zéro, pour les booléens c'est false.

    Au départ c'est une histoire de pragmatisme pour la performance et la mémoire. Les objets sont des structures lourdes à stocker et accéder, alors que les types de base sont très simplistes, pouvant donc être utilisés de manière moins lourde. De nos jours ça se justifie moins, les JVM seraient capables d'optimiser les objets simples comme si c'était des types de base, et du coup ça n'aurait plus d'intérêt d'avoir une différence objet/type de base.
    Mais historiquement ce n'était pas réaliste, et maintenant ce serait compliqué ou incompatible d'essayer d'éliminer cette différence.
    Il y a aussi d'autres questions, comme le fait qu'il est pratique d'avoir des types qui ne peuvent pas être null. Ou à l'inverse, que ce ne serait pas pratique si des objets complexes étaient créés sans qu'on ait encore eu l'occasion de décrire comment ils devraient être créés (avec quels paramètres ? C'est pour ça qu'il faut un new qui indique ce qu'on veut.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    On peut les utiliser les variables : ce qu'on ne peut pas utiliser ce sont des instances qui n'existent pas (y compris des variables de ces instances). Rien de plus proche de la réalité en fait. En C, par contre tu n'as pas d'objet : toutes les variables sont typés avec des types équivalents aux types primitifs. Mais si toutes les variables ont une valeur dès leur déclaration, cette valeur peut être n'importe quoi : pour que qu'il s'agit d'un pointeur, et ça peut pointer sur une zone de mémoire non prévue, ce qui n'est pas très différent de quelque chose qui n'existe pas : disons que ça existe, mais que ce n'est pas ce que ça devrait être. Un peu comme si on posait des pneus sur la jante d'une voiture qui n'existe pas, tout en ne se rendant pas compte qu'en fait on vient de poser les pneus dans le four de sa cuisine et qu'au lieu de serrer les boulons, on vient de lancer la pyrolyse... je te laisse imaginer la suite...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    J'ai un soucis pour modifier un tableau sur un héritage.
    Je créer le tableau sur la classe mère, mais je ne peux pas faire de new tableau dans la classe fille ...

    La classe mère
    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
     abstract class Surface {
     
        protected Segment tabl[];
     
        protected Surface(){
        }
     
        public void affichage(){
            for(int i=0 ; i<tabl.length ; i ++){
                int n = i+1;
                System.out.println("Le segment " + n);
                System.out.println("1er point" + "  x=" + tabl[i].getPoint1().getX() + "  y=" + tabl[i].getPoint1().getY());
                System.out.println("2er point" + "  x=" + tabl[i].getPoint2().getX() + "  y=" + tabl[i].getPoint2().getY());
                System.out.println("Longueur du segment" + "  " + tabl[i].getLongueur());
                }
        }
    }
    La classe fille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Triangle extends Surface {
     
        public Triangle(Segment S1, Segment S2, Segment S3){
            Segment tabl[] = new Segment[3];
            super.tabl[0] = S1;
            super.tabl[1] = S2;
            super.tabl[2] = S3;
        }
    }
    J'ai aussi une classe fille Rectangle quasi identique à Triangle.
    Il faut donc que le tableau change de taille pour chaque classe. Seulement je ne peux pas ... Si je met un super devant le tabl[] de Triangle ca me marque une erreur, alors qu'elle n'y est pas sans le super !
    C'est frustrant car le code marche, si je crée un tableau de 3 valeurs directement dans la classe mère ca fonctionne ! Je ne comprend pas ... Et je n'ai rien trouvé pour m'aider ...

  14. #14
    Modérateur

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

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

    Le mieux en fait, serait d'arrêter de mettre [] à la fin dans Segment tabl[];. Malheureusement Java autorise cela pour faire plaisir à ceux qui viennent du C, mais il faut reconnaître que ça n'a ni queue ni tête.

    Une syntaxe logique, c'est par exemple :
    Qu'est-ce qu'ils veulent dire, les [] ? Ils veulent dire, "et cette variable, c'est un tableau." C'est une information sur le type de la variable. Ça n'a donc rien à faire à droite de la variable quand le reste du type est à gauche. C'est moins confus de le mettre avec le reste du type, à gauche de la variable.


    Et donc une fois qu'on a décidé ça, qu'est-ce que ça donne ?
    Tu as écrit Segment tabl[] = new Segment[3]; et ça ne fait pas ce que tu voulais... Forcément cette ligne est grosso-merdo de la forme Type nom = valeur qui sert à déclarer une nouvelle variable. Tu veux pas une nouvelle variable, tu veux celle qui vient de la classe mère, donc forcément ça ne va pas.

    Sans doute avais-tu d'abord essayé tabl[] = new Segment[3];, où il est clair que tu ne déclares rien du tout, mais ça ne marchait pas...
    Ça ne marchait pas à cause du [] à droite de la variable, qui est une information de type. Alors qu'on sait déjà quel est le type de la variable puisqu'elle a déjà était déclarée et qu'on ne cherche pas à en déclarer une autre. On veut assigner une valeur à cette variable, et la syntaxe correcte est nom = valeur, ce qui donne :
    Les super sont superflus, comme cette variable est visible depuis la classe mère grace à protected, les classes filles savent bien que c'est de ça qu'on parle, à moins qu'elles déclarent leur propre variable tabl, ce qui ne serait pas malin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 15
    Par défaut
    D'ac ! Je comprend pour les [], ca me parait même logique comme tu le dit.

    Les super sont bien superflus, malgré que le prof les veux quand même, par pédagogie, comme les this.

    Bon je continue !

    Merci en tout cas !

  16. #16
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Les mots clés "super" et "this" sont loin d'être superflus ou avec un rôle uniquement pédagogique : ton prof veut vous faire prendre des bonnes habitudes qui permettent de s'assurer d'éviter des problèmes de shadowing : des variables dans des classes filles qui ont le même nom que les variables dans les classes mères.

    En écrivant ce code dans le constructeur de ta classe fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Segment tabl[] = new Segment[3];
            super.tabl[0] = S1;
            super.tabl[1] = S2;
            super.tabl[2] = S3;
    Tu crées un tableau dans ta classe fille... Mais c'est le tableau de la classe mère dans laquelle tu mets tes paramètres S1, S2 et S3. Du coup ta déclaration ne sert à rien

    Si tu avais écrit dans ce même constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Segment tabl[] = new Segment[3];
            tabl[0] = S1;
            tabl[1] = S2;
            tabl[2] = S3;
    Tu aurais juste déclaré localement un tableau qui aurait aussitôt disparu dans le néant du garbage collector... (vu qu'aucun objet n'a de référence vers lui)


    Les mots clés super et this permettent de s'assurer de la déclaration faites des variables et ils sont très importants. Si tu déclares toujours avec l'un de ces mots clés à quelle variable tu accèdes, tu vas t'éviter des bugs !

  17. #17
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Beuh, pour éviter le shadowing, il suffit de ne pas déclarer des variables de même nom -_-°... Et pour les grands-parents, on fait comment ?
    Surtout qu'aussi souvent que c'est pragmatique, il vaut mieux appeler des méthodes que toucher directement aux variables de la classe mère.

    Il ne manque pas de code Java de grande qualité dans les projets open-source, et ils utilisent très peu le super, ni n'abusent-ils du this.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/09/2006, 15h48
  2. class qui ne marche pas
    Par RaphAstronome dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2006, 20h00
  3. [POO] Methode de classe qui ne s'exécute pas
    Par gregal dans le forum Langage
    Réponses: 2
    Dernier message: 11/04/2006, 11h01
  4. [CSS]Classe qui ne s'applique pas
    Par narnou dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 17/03/2006, 14h11
  5. class qui ne s'applique pas sous opéra pour les <tr>?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/03/2006, 16h55

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