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 :

Comment instancier des classes internes?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Comment instancier des classes internes?
    Bonsoir!

    Je cherche à améliorer certaines de mes compétences par thèmes et j'étudie aujourd'hui l'instanciation et les classes internes.

    Je suis face à des classes Vehicule et des classes Tourisme qui sont des sous classes de la classes Transport. La classe Véhicule a la classes interne Moteur et Carrosserie. La classe Moteur a un contructeur et la classe Carosserie n'en a pas.

    D'où le code suivant:

    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
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class CC15Ex3 {
    	public static void main(String[] args){
    		Vehicule t1 = new Tourisme(10,90);
    	}
     
    }
     
    class Transport{
    	int no;
    	int annee;
    }
     
    class Vehicule extends Transport{
    	int puissance;
    	String couleur;
    	public String toString(){
    		return "Vehicule no " + no +" puissance "+puissance;
    	}
    	Moteur mot;
    	static class Moteur{
    		static int annee;
    		int no;
    		int kilometrage;
    		static int noC=100;
    		static int puissance =90;
    		Moteur(){
     
    		}
    		public String toString(){return "Moteur no" + no+" km "+ kilometrage+ "puiss" + puissance +" année "+ annee;}
    	}
    		class Carosserie{
    			String couleur;
    		}
    }
     
    class Tourisme extends Vehicule{
    	String marque;
    	Tourisme(int n, int p){
    			no=n;			
    	}
    }
    Je cherche a instancier un Moteur m1 dont je dois préciser le type et une Carrosserie C1 dont je dois préciser aussi le type.

    J'ai donc fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public static void main(String[] args){
                    Moteur m1 =Vehicule.Moteur();
    		Carrosserie c1= Vehicule.Carosserie;
    		Vehicule t1 = new Tourisme(10,90);
     
    	}
    Mais, en vérifiant sur Eclispe, on remarque que la plateforme signale
    • "Multiple markers at this line
    • - Moteur cannot be resolved to a type
    • - The method Moteur() is undefined for the type "

    pour la première instanciation. Et

    • Multiple markers at this line
    • - Carrosserie cannot be resolved to a type
    • - Vehicule.Carosserie cannot be resolved to a variable


    pour la seconde.

    Tandis que le compilateur crie:

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    Moteur cannot be resolved to a type
    The method Moteur() is undefined for the type Vehicule
    Carrosserie cannot be resolved to a type
    Vehicule.Carosserie cannot be resolved to a variable

    at exercices.CC15Ex3.main(CC15Ex3.java:6)
    Qu'ai je fais de mal?

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Eclipse ne te remonte-t'il pas une erreur pour la classe "CC15Ex3" ???

    Car j'ai copié ton code chez moi dans une classe Vehicule.java mais la classe "CC15Ex3" étant en dehors de Vehicule, cela pose un problème.

    Comment est nommé ton fichier .java acceuillant ton code ?

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,
    Citation Envoyé par francky74 Voir le message
    Bonjour,

    Eclipse ne te remonte-t'il pas une erreur pour la classe "CC15Ex3" ???

    Car j'ai copié ton code chez moi dans une classe Vehicule.java mais la classe "CC15Ex3" étant en dehors de Vehicule, cela pose un problème.

    Comment est nommé ton fichier .java acceuillant ton code ?
    Tu aurais du remarqué aussi que eclipse t'indique le problème ! C'est la classe CC15Ex3 qui est public et qui doit donc être définit dans un fichier CC15Ex3.java et non pas Vehicule.java

    Citation Envoyé par AntoineCompagnie Voir le message
    B[*] - Moteur cannot be resolved to a type
    Normal Moteur est une classe interne de Vehicule il faut donc que tu fasses un import de 'Vehicule.Moteur'

    Citation Envoyé par AntoineCompagnie Voir le message
    [*] - The method Moteur() is undefined for the type "
    Et oui une classe ne s'appelle pas comme une methode, il faut l'instancier tu dois donc faire un 'new'

    Citation Envoyé par AntoineCompagnie Voir le message
    [*]- Carrosserie cannot be resolved to a type
    même problème que le moteur, il faut faire l'import, mais en plus tu l'as ma écrit, et oui c'est Carosserie et non Carrosserie
    en utilisant la complession (ctrl + espace) dans eclispe tu évitera cette dernière erreur !
    Citation Envoyé par AntoineCompagnie Voir le message
    [*]- Vehicule.Carosserie cannot be resolved to a variable
    La c'est un peu plus conplexe que pour le moteur.
    En effet le Moteur est une classe interne, mais static ce qui n'est pas le cas de Carosserie et donc pour pouvoir l'instantier tu dois le faire sur l'instance de Vehicule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vehicule t1 = new Tourisme(10, 90);
    Carosserie c1 = t1.new Carosserie();

  4. #4
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    D'accord, donc je dois

    • faire un import de 'Vehicule.Moteur'

      mais je ne sais pas ce que c'est faire une import...
    • faire un 'new' pour instancier car une classe ne s'appelle pas comme une methode

      Donc je fais

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class CC15Ex3 {
      	public static void main(String[] args){
      		Moteur m1 = new Vehicule.Moteur();
      	}
       
      }
    • pour pouvoir linstancier une Carosserie je dois le faire sur l'instance de Vehicule

      Mais pourquoi une telle spécificité quand la classe n'est pas static?

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class CC15Ex3 {
      	public static void main(String[] args){
      		Carosserie c1 = new t1.Carosserie;
      	}
       
      }


    Finalement sur ideone j'obtiens les erreurs suivantes (je suis pas à ma fac, on est dans le même PRES que les Mines de Paris, du coup je bosse au Mines, si quelqu'un connait une salle ou l'on peut accéder et utiliser Eclipse, je suis preneur...):

    Main.java:1: error: class CC15Ex3 is public, should be declared in a file named CC15Ex3.java
    public class CC15Ex3 {
    ^
    Main.java:3: error: cannot find symbol
    Moteur m1 = new Vehicule.Moteur();

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    mais je ne sais pas ce que c'est faire une import...
    L'import est utiliser habituellement dans le cadre de la notion de package , mais elle peut s'appliquer dans le cas des classe interne aussi comme tu as pu le constater.
    Cela évite de constamment écrire le nom complet de la classe qui est en général : mon.package.Maclasse
    Dans ton cas le nom complet de la classe 'Moteur' c'est Vehicule.Moteur si la classe Vehicule se trouve dans le fichier Vehicule.java....
    Si tu indiques le nom complet de la classe tu n'es donc pas obligé d'en faire l'import et tu doit donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vehicule.Moteur m1 = new Vehicule.Moteur();
    Avec l'import tu écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import Vehicule.Moteur;
     
    public class CC15Ex3 {
    	public static void main(String[] args) {
    		Moteur m1 = new Moteur();
                    ....
    	}.....
    Cependant, vue que tu n'as qu'une classe public je serais tenté de dire que tu as mis tes classes dans un seul fichier, ce qui est incorrect. Normalement tu devrais avoir un fichier par classe.
    Les seules classe que l'on peux trouver dans le même fichier que la classe principal (public) sont les classe interne justement.

    Citation Envoyé par AntoineCompagnie Voir le message
    Mais pourquoi une telle spécificité quand la classe n'est pas static?
    ce n'est pas une spécificité, c'est comme une variable.... si elle est static alors tu y accède directement via la classe sinon tu y accède via l'instance de celle ci

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2006, 17h59
  2. Réponses: 2
    Dernier message: 01/02/2006, 15h02
  3. comment utilisé des classes toute prêtes
    Par Burinho dans le forum Langage
    Réponses: 3
    Dernier message: 23/01/2006, 22h18
  4. [debutant] Comment ajouter des .class ?
    Par Slein dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/04/2004, 14h30
  5. [SWT] Comment faire des fenetres internes ??????
    Par sebounator dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 22/04/2004, 01h12

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