Partage
  • Partager sur Facebook
  • Partager sur Twitter

Héritage - 2 classes filles (2)

Suite et fin de cette question

Sujet résolu
    15 avril 2012 à 15:45:24

    Rebonjour à tous !

    Je suis une vraie nouille !

    J'ai marqué "Résolu" mon sujet précédent, en oubliant que cela mettait fin à la possibilité d'y répondre à nouveau ! o_O

    Aussi, pardon pour ce nouveau sujet, qui aurait dù avoir sa place dans mon post précédent ... Je serais plus vigilant ! (Pardon pour les modérateurs qui verront cette bévue ...)

    Suite à la résolution de ma question, que je viens de tester, je me trouve avec un événement inattendu ...

    Ma classe mère "Voiture" et mes classes filles "Lotus", "Ferrari" sont identiques à ma question précédent qui est sur le forum sous le titre : "Héritage - 2 classes filles".

    Je viens de modifier ma classe principale nommée "Test" suite à l'aide précieuse de rickthomas et sheron (Au passage : Encore merci les gars ! Pas trop fraîche les bières ? Ca va ? ;) )

    L'événement inattendu : Mes variables "maVoiture.accesseurs" contenus dans mon switch sont bien reconnues.
    Mais celles déclarées en dehors du switch, les deux dernières lignes de code, ne sont pas reconnues (Elles sont déclarées comme non initialisées).

    Comment peuvent-elles être initialisées dans le switch, et non en dehors de celui-ci ? Du coup, comment puis-je déclarer mes constructeurs new Lotus() et new Ferrari () ou encore mon switch pour passer cette incohérence, et qu'ainsi ces variables soient reconnues d'un bout à l'autre de mon programme ?

    Encore une fois, merci du temps que vous avez prit pour me lire.

    (Et au passage, merci sheron d'avoir prit du temps pour ton explication sur comment "aérer" la programmation, c'était d'un très intéressant, de deux pédagogique encore une fois, et de trois même pour moi c'est déjà plus agréable pour me lire :) )

    Classe "Test" :

    import java.util.Scanner;
    
    public class Test {
    	public static void main (String [] args) {
    		int entréeClavier;
    		
    		Voiture maVoiture;
    		
    		Scanner lectureClavier = new Scanner (System.in);
    		
    		System.out.println("Choisis ta voiture :");
    		System.out.println("--------------------");
    		System.out.println("1. Lotus");
    		System.out.println("2. Ferrari");
    		entréeClavier = lectureClavier.nextInt();
    		
    		while ((entréeClavier != 1) && (entréeClavier != 2)) {
    			System.out.println("Refait un choix ...");
    			entréeClavier = lectureClavier.nextInt();
    		}
    		
    		switch (entréeClavier) {
    		case 1 :
    			maVoiture = new Lotus();
    			System.out.println("Tu as choisit : " + maVoiture.getNom());
    			break;
    		case 2 :
    			maVoiture = new Ferrari();
    			System.out.println("Tu as choisit : " + maVoiture.getNom());
    			break;
    		}
    		
    		System.out.println("Tu as choisis : " + maVoiture.getNom());
    		System.out.println("Sa vitesse maximum est : " + maVoiture.getVitesse());
    		
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 avril 2012 à 15:57:10

      si tu n'es dans dans case 1 ou 2 ma voiture sera null, donc pas bon.

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        15 avril 2012 à 16:01:16

        Ce qui arrive ici, c'est que le compilateur percoit une possibilité que la variable de type voiture ne soit jamais initialisé. En effet que se passe-t-il dans le cas ou la variable prends la valeur 8 ? (Je sais que c'est impossible dans ton programme... mais le compilateur ne connait pas toute la logique de ton programme)

        Dans ton switch, la variable voiture ne sera jamais initialisé :-°
        Le compilateur percoit ce comportement et te le souligne :)

        Pour régler ce problème deux choix :

        1)à la ligne 7 de ton programme tu initialise maVoiture à null
        Voiture maVoiture = null;
        

        2) ou puisque que dans ton switch tu ne peux avoir que la valeur 1 ou 2 tu peux modifier ton example comme ceci :

        switch (entréeClavier) {
        		case 1 :
        			maVoiture = new Lotus();
        			System.out.println("Tu as choisit : " + maVoiture.getNom());
        			break;
        		default :
        			maVoiture = new Ferrari();
        			System.out.println("Tu as choisit : " + maVoiture.getNom());
        			break;
        		}
        


        Personnellement j'irais avec la méthode 1.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 avril 2012 à 16:02:00

          Pour répondre à ton problème, met une valeur arbitraire à la déclaration de mavoiture ou ajoute un default à la fin de ton switch dans lequel tu donnes une valeur à mavoiture.

          Ce qui se passe : toi, tu sais que entreeclavier vaut soit 1 soit 2. Le compilateur lui ne le sait pas. Donc pour lui, ton switch donne une valeur à mavoiture uniquement pour 1 et 2. Si entreeclavier vaut autre chose, mavoiture sera indéfini, d'où l'erreur.
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2012 à 16:08:00

            Quand tu marques ton sujet résolu, ça ne t'empêche pas de répondre à la suite. Quand tu es le dernier du sujet à avoir posté, tu ne peux pas reposter tout de suite après; tu dois attendre 24h. C'est une sécurité contre les spammeurs qui écrivaient 30 fois "Up!" en 1 heure ^^

            Réponse fausse, j'ai inversé le but de ta condition dans ma tête en réfléchissant, manque de recul :-° ..
            Ton problème vient directement de ta condition (entréeClavier != 1) && (entréeClavier != 2). Dans cette condition, tu dis que le variable entréeClavier doit être différente de 1 et différente de 2.
            En l'occurrence, nous voulons que entréeClavier soit égale à 1 ou égale à 2; ce qui nous donne (entréeClavier == 1) || (entréeClavier == 2).


            Je suis content de voir que mes explications te plaisent ;) !
            Ce coup-ci je veux une bouteille :lol: !
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2012 à 16:24:16

              rickthomas : Merci, effectivement ta première méthode me convient parfaitement, elle est simple (la deuxième aussi remarque ;) Et au passage, tes réponses sont vraiment très bien pensées ça fait déjà plusieurs fois que je te lis au traveres des questions du forum et c'est à chaque super agréable d'avoir des explications simples et pourtant détaillées).
              sheron : Ouais ! T'essayes de m'embrouiller là avec les && et ||, j'te vois venir ! :D(Merci pour l'explication du post sous 24h, je ne m'en souvenais déjà plus, pour moi mon précédent sujet était considéré comme clos).
              brubru777 : Merci, c'est vrai que pour moi le code paraîssait clair mais je pense pas en Java (pour l'instant ... ;) ) du coup je peux passer à côté de ces astuces.

              shakal, rickthomas, brubru777, sheron encore une fois : Merci !!!

              Mais comment ?
              Comment j'ai pas eu la présence d'esprit d'initialiser tout simplement ma variable "maVoiture" ?!

              (Et maintenant sheron qui veut une bouteille ?! Non, c'est bon les gars, j'arrête Java là ! Ca devient n'importe quoi les tarifs binouzes ! ;) )

              Bon, je redonne ce petit programme aux nouveaux arrivants et débutants comme moi, qui en auraient besoin pour passer cet appréhension du Java au niveau du concept Héritage.
              Je vous rajoute quelques lignes de codes pour rendre ce programme plus amusant, et plus didactique ... C'est la moindre des choses que je puisse faire pour aider à mon niveau à syntéthiser les réponses que m'ont apportés : rickthomas, sheron, shakal et brubru777 (Merci de votre aide les gars ! Je vous ressert une bière ? :D )

              Voici ma classe mère "Voiture" :
              (Elle sert pour appréhender la notion d'héritage)

              public class Voiture {
              	String nom;
              	int vitesse;
              	
              	public Voiture() {
              	}
              	public String getNom() {
              		return nom;
              	}
              	public int getVitesse() {
              		return vitesse;
              	}
              	public void setNom(String argNom) {
              		nom = argNom;
              	}
              	public void setVitesse(int argVitesse) {
              		vitesse = argVitesse;
              	}
              }
              


              Ma première classe fille "Lotus" :
              (Elle hérite de la classe mère "Voiture" mais change les variables "nom" et "vitesse" de celle-ci, ses attributs seront ainsi construis)

              public class Lotus extends Voiture {
              	public Lotus(){
              		nom = "Lotus";
              		vitesse = 330;
              	}
              }
              


              Ma seconde classe fille "Ferrari" :
              (Tout comme "Lotus" elle change les variables "nom" et "vitesse" de la classe mère "Voiture")

              public class Ferrari extends Voiture {
              	public Ferrari () {
              		nom = "Ferrari";
              		vitesse = 430;
              	}
              }
              


              Ma classe "Test" qui contient la méthode "main" :
              (Vous pourrez en prime utiliser les accesseurs pour la variable "vitesse" histoire de mettre un peu de pratique à l'agréable !)

              import java.util.Scanner;
              
              public class Test {
              	public static void main (String [] args) {
              		int entréeClavier;
              		
              		Voiture maVoiture = null;
              		
              		Scanner lectureClavier = new Scanner (System.in);
              		
              		System.out.println("Choisis ta voiture :");
              		System.out.println("--------------------");
              		System.out.println("1. Lotus");
              		System.out.println("2. Ferrari");
              		entréeClavier = lectureClavier.nextInt();
              		
              		while ((entréeClavier != 1) && (entréeClavier != 2)) {
              			System.out.println("Refait un choix ...");
              			entréeClavier = lectureClavier.nextInt();
              		}
              		
              		switch (entréeClavier) {
              		case 1 :
              			maVoiture = new Lotus();
              			System.out.println("Tu as choisit : " + maVoiture.getNom());
              			break;
              		case 2 :
              			maVoiture = new Ferrari();
              			System.out.println("Tu as choisit : " + maVoiture.getNom());
              			break;
              		}
              		// Ici, la variable maVoiture est bien reconnue par le programme !
              		System.out.println("Sa vitesse maximum est : " + maVoiture.getVitesse());
              		
              		System.out.println("Souhaitez-vous accélérer ?");
              		System.out.println("Entrez une vitesse de 0 à :" + maVoiture.getVitesse());
              		entréeClavier = lectureClavier.nextInt();
              		while ((entréeClavier >= maVoiture.getVitesse() + 1)) {
              			System.out.println("Attention tu vas casser le moteur là !!!");
              			System.out.println("Refais un choix de vitesse : ");
              			entréeClavier = lectureClavier.nextInt();
              		}
              		maVoiture.setVitesse(entréeClavier);
              		System.out.println("Tu roules à : " + maVoiture.getVitesse());
              	}
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                15 avril 2012 à 20:48:28

                Pour t'entrainer avec la notion de super classe, tu peux aussi ajouter un constructeur Voiture(nom, vitesse) et l'utiliser dans tes deux autres classes. :)
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2012 à 22:18:23

                  Merci brubru777 de m'aider à progresser !

                  J'en prends note !

                  Je me propose de reposter une réponse quand je me serais un peu exercer, pour savoir ce que tu en penses, ou si je trébuche sur une erreur de programmation :-°

                  Ce qui ne devrait pas arrivé, là j'ai le sentiment d'avoir avancé grâce à votre aide !!!

                  "Je suis le roi du Monde !!! Youhou !!!" :p
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Héritage - 2 classes filles (2)

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown