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 :

Instancier une classe dans un constructeur d'une autre classe ?


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut Instancier une classe dans un constructeur d'une autre classe ?
    Bonjour à tous,

    Débutant en Java, je me posait la question de savoir s'il est possible d'instancier une classe dans le constructeur d'une autre classe, j'ai fait l'essai par curiosité avec une classe Point incluant une classe Toto :

    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
     
    public class Point {
     
    // mon constructeur de Point
    public Point(int abs, int ord, int to) {
            x = abs ;
            y = ord ;
            Toto t = new Toto(to) ;
            t.getToto() ; // ok fonctionne
        }
     
    // essai classe incluse dans la classe Point (doit-elle être privée ?)
       public class Toto {
           public Toto(int x) {
               a = x ;
           }
           public void getToto() {
               System.out.println("Toto : " + a) ;
           }
           private int a ;
       }
    }
    Dans mon main, si j'appelle le constructeur de Point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Point p = new Point(1, 2, 3) ;
    J'ai bien Toto : 3 qui s'affiche.

    Si j'essaie d'appeler l'instance de Toto créée dans le constructeur Point j'ai une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	at javaapplication1.JavaApplication1.main(JavaApplication1.java:64)
    Java Result: 1
    Ceci est juste un essai, je me posais la question de savoir s'il est possible d'instancier une classe dans le constructeur d'une autre classe.

    Pourriez-vous svp me dire ce qui cloche dans le code et si c'est quelque chose qui se fait en général en Java, si ça a un intérêt et si c'est bien sous cette forme que ça doit se faire ?

    Par ailleurs est-il possible de la même manière d'instancier une classe directement en argument d'un autre constructeur ?

    Je vous remercie,

    C. Tobini

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ctobini Voir le message
    Bonjour à tous,

    Débutant en Java, je me posait la question de savoir s'il est possible d'instancier une classe dans le constructeur d'une autre classe,
    Ben oui, il n'y a pas de raisons pour que ça ne marche pas. Sinon on aurait énormément de mal de faire quoi que ce soit d'utile dans un constructeur pour initialiser la classe
    Si j'essaie d'appeler l'instance de Toto créée dans le constructeur Point j'ai une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	at javaapplication1.JavaApplication1.main(JavaApplication1.java:64)
    Java Result: 1
    Ce serait peut être bien de nous montrer ce que tu essaie de faire. Donc ton code et l'erreur au complet, pas juste une ligne au hasard. Vu que tu ne stocke pas ton Toto dans ton Point, il n'y a a priori aucun moyen de le récupérer après l'appel au constructeur (il est peut être même déjà récupéré par le garbage collector)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Ok, merci de ta réponse tchize, je vais détailler un peu plus, c'est vrai que c'est light

    En fait je ne veux rien faire de concret, j'essaie juste pour le moment de comprendre la manière dont se comportent les classes en Java.

    La question que je me pose : j'ai une classe Point contenant une classe Toto, je me demande (mais tu m'as répondu) s'il est possible de créer une instance de Toto dans un constructeur de Point et comment utiliser cette instance de Toto par la suite.

    J'ai donc cette classe :

    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
    public class Point {
     
    // mon constructeur de Point
    public Point(int abs, int ord, int to) {
            x = abs ;
            y = ord ;
            Toto t = new Toto(to) ;
            t.getToto() ; // ok fonctionne
        }
     
    // essai classe incluse dans la classe Point (doit-elle être privée ?)
       public class Toto {
           public Toto(int x) {
               a = x ;
           }
           public void getToto() {
               System.out.println("Toto : " + a) ;
           }
           private int a ;
       }
    }
    La classe Toto contient un constructeur et une méthode de renvoi de la valeur de la seule et unique variable de la classe.

    La constructeur de Point contient une instance de Toto ainsi que le renvoi de la variable a de Toto.

    Lorsque j'appelle le constructeur de Point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main() {
    Point pp = new Point(1, 2, 3) ;
    }
    Avec le résultat qui s'affiche :

    Toto : 3

    Le constructeur exécute bien la méthode getToto() de l'objet Toto créé par le constructeur de Point.

    La question que je me pose est : puis-je maintenant utiliser l'objet t de Toto instancié dans le constructeur de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main() {
    Point pp = new Point(1, 2, 3) ;
    pp.t.getToto() ;
    }
    C'est là que j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	at javaapplication1.JavaApplication1.main(JavaApplication1.java:64)
    Ce n'est pas une ligne au hasard, c'est juste la seule ligne que Netbeans affiche Mais, tu l'auras compris, je débute aussi sous Netbeans, je ne sais actuellement pas si je peux avoir quelque chose de plus verbeux.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ctobini Voir le message

    La constructeur de Point contient une instance de Toto ainsi que le renvoi de la variable a de Toto.
    Pour être exact, le constructueur ne contient rien d'autre que du code. le contexte courant (définit par les accolades { } ) contient une variable de type Toto où l'on stocke la référence vers la nouvelle instance de Toto.
    La question que je me pose est : puis-je maintenant utiliser l'objet t de Toto instancié dans le constructeur de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main() {
    Point pp = new Point(1, 2, 3) ;
    pp.t.getToto() ;
    }
    C'est là que j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	at javaapplication1.JavaApplication1.main(JavaApplication1.java:64)
    Non, parce que Point n'a pas de champ de Type Toto et appelé t.

    Pour pouvoir utiliser ce code, il aurait fallu écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Point {
      Toto t;
    // mon constructeur de Point
    public Point(int abs, int ord, int to) {
            x = abs ;
            y = ord ;
            t = new Toto(to) ;
            t.getToto() ; // ok fonctionne
        }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    [...]
    Non, parce que Point n'a pas de champ de Type Toto et appelé t.

    Pour pouvoir utiliser ce code, il aurait fallu écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Point {
      Toto t;
    // mon constructeur de Point[...]
        }
    D'accord, merci des explications, la variable doit donc être intégrée dans la classe pour être exploitable par l'objet de type Point

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  2. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  3. Réponses: 2
    Dernier message: 01/03/2010, 13h46
  4. Réponses: 7
    Dernier message: 22/10/2006, 18h51
  5. Réponses: 3
    Dernier message: 06/11/2005, 18h02

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