j'ai du mal à comprendre. Dans les 2 cas je crée une tortue des galapagos?
Donc ma tortueDesGalapagos héritera de toute les caractéristique de animal et tortue. Enfin bref je suis assez perdu
Version imprimable
j'ai du mal à comprendre. Dans les 2 cas je crée une tortue des galapagos?
Donc ma tortueDesGalapagos héritera de toute les caractéristique de animal et tortue. Enfin bref je suis assez perdu
Oui, mais dans un cas tu mets cette tortue dans une variable de type Animal. Donc ça veut dire que le programme qui utilise cette variable, marche avec n'importe quel Animal : n'importe quelle tortue, mais aussi un Lièvre.
Dans l'autre cas tu le mets dans une variable de type Tortue. Donc ça veut dire que le programme ne marcherait pas avec un Lièvre, mais il marche avec n'importe quelle Tortue, de floride, des galapagos ou d'ailleurs.
L'objet que tu as mis dans cette variable, il se trouve qu'en réalité c'est une TortueDeFloride. Mais c'est pas important. Le type de la variable dit que ça marche avec n'importe quel Tortue, tu aurais pu y mettre une autre Tortue si tu voulais.
Et dans le deuxième cas, la variable étant de type Animal, ça marcherait même avec n'importe quel Animal.
Allez une dernière question à propos de la question 8 car je suis simple d'esprit :roll:
Comment puis
public static void main(String[] args){
Tortue t = new TortueDeFloride() ;
int i = compareVitesse(t,t);
}
public static int compareVitesse(Animal a, Animal b) { …} fonctionne
public static int compareVitesse(Animal a, Tortue b) { …} fonctionne
public static int compareVitesse(Tortue a, Animal b) { …} fonctionne
public static int compareVitesse(Lievre a, Animal b) { …} fonctionne pas
public static int compareVitesse(Animal a, TortueDeFloride b) { …} fonctionne pas
Pour la dernière vu que le type est tortue le compilateur n’acceptera pas même si en pratique le programme pourrait tourner dans ce cas. J'ai raison?
En tout cas je tiens à vous remerciez pour toute vos réponse en espérant ne pas trop vous embêtez.. Je fais passer les explications à toute ma classe sa sauvera surement quelque personne :oops:
L'an dernier cette examen à eu un tôt d’échec de 80% en 1er session :aie:
On ne te demande pas si elles fonctionnent. On te dit qu'elles sont toutes là, le compilateur doit donc choisir laquelle il va appliquer. On te demande si le compilateur est capable de choisir la bonne méthode à appliquer, autrement dit, l'appel est-il ambigu, oui ou non ?
En effet, elle ne s'applique pas aux paramètres indiqués (Tortue, Tortue.) Le compilateur ne la retient pas comme candidate applicable, il ne l'appellerait pas même si c'était la seule méthode de ce nom.Citation:
Pour la dernière vu que le type est tortue le compilateur n’acceptera pas même si en pratique le programme pourrait tourner dans ce cas. J'ai raison?
Mais il n'y a pas de "en pratique." Si la variable passée était de type TortueDeFloride, les paramètres (TortueDeFloride, TortueDeFloride) s'appliqueraient et elle serait une candidate. Ce n'est pas le cas, la variable est de type Tortue, pas TortueDeFloride. Fin de l'histoire.
Il est clair que ces exercices te dépassent complètement. Tu ne réalises clairement pas la distance. Apparemment ça ne vient pas de toi mais du cours lui-même, s'il y a 80% d'échec.
"Faire passer" ça, ne sauvera personne qui n'aurait pas su y répondre facilement.
Il n'est jamais trop tard pour le réussir :)
public static int compareVitesse(Animal a, Animal b) { …}
public static int compareVitesse(Animal a, Tortue b) { …}
public static int compareVitesse(Tortue a, Animal b) { …}
public static int compareVitesse(Lievre a, Animal b) { …}
public static int compareVitesse(Animal a, TortueDeFloride b) { …}
Bon j'ai réfléchis, c'est ambigu entre la 2eme et la 3eme méthode.
Le compilateur va prendre ce qui est le plus proche des types donner mais ne pourras pas choisir entre la seconde et la troisième car elle se valent entre elle.
Sinon la 1er est possible mais la 4 et 5 ne sont pas possible
Exactement.
merci beaucoup. Je commence à sortir de l'eau grâce a vous :ccool:
De retour, bon 1er semaine d'examen passer. Mardi exam de java qui contiendra plus d'objet que prévu. j'ai relu toute vos réponse attentivement et j'ai eu plusieurs déclic sur plein de point :)
Mais j'ai encore des questions que je vais poster dans l'ordre après j'aurais presque comprit la matière sur cette partie :)
Il y a une chose qui ma interpeller
dans la question 1 pour créer une classe d'instance on fait
a = new A
tandis que dans la question 5 on a
Object fruit = new Fruit
Bon d'après mon idée le "Object" est le type de la variable (pour le compilateur) comme expliquer avec les tortues de la question 8 mais je me pose la question dans l'exercice 1 a est de type A ?
on voit A x;
x = new A();
donc si j'ai bien comprit on peut spécialiser avant de crée l'instance de classe.
Ensuite je reviens à l'exercice 4 car en relisant j'ai remarqué qu'il y avait un piège dans l’énoncer qui ma sûrement faussé mes réponses donc je le refais
1. Non car fruit est l'instance de GoldenDelicious qui hérite de Apple et dont Apple hérite de Fruit, donc Orange n'est pas une précision de GoldenDelicious
2.Oui car fruit est la précision de Apple
3.Oui mais seulement si Fruit orange = new Orange
4.Non car Apple est une sous classe fils au même niveau que Orange
5. fruit peut utiliser cette méthode seulement si fruit et déclaré de type Apple ou Fruit orange ne pourra pas l'utiliser sauf si orange est de type Fruit
6.fruit peut l'utiliser seulement si fruit est déclarer comme suit
(Fruit fruit = new GoldenDelicious)
pour orange il n'y aura aucun problème qu'il soit de type Fruit ou de type Orange
pour la suite j'ai réfléchie à la question 9 poster précédemment (c'est super tordu et malsain)
l'output sera:
2 2 6
2 2 6 70
4 5 6 70
80 80 80
9 9 9
9 9 9 9
80 80 80
Malheureusement j'ai oublier mon chargeur en classe donc je me retrouve juste avec mon petit lenovo sous linux ou je n'ai rien installer permettant de compiler du java --' pratique quand on as même pas le temps d'aller au toilette en paix... (j'ai étudier le shell en plein examen :ccool:)
"Instance de classe," pas "classe d'instance."
La variable c'est x, pas a. Mais x est de type A, oui.
Spécia-quoi ?
C'est exactement la même chose que :
Sauf qu'au lieu de int on a A, et que les int n'étant pas des objets, ce qu'on assigne à une variable int n'est pas des instances d'objets, donc pas besoin de new.Code:
1
2 int i; i = 8;
Dis juste que GoldenDelicious n'est pas une classe descendante d'Orange. (ou qu'Orange n'est pas un type ascendant de GoldenDelicious.)
préci-quoi ? Ça veut rien dire.
Est-ce que la variable fruit contient une instance d'une classe qui est une classe descendante de Apple ? C'est la seule question qu'on te pose.
Et vu que l'énoncé n'indique pas la déclaration de la variable orange, mais indique que cette variable est assignée orange = new Orange();, oui tout court, sans condition.
Mouais. Même niveau donc aucune est sous-type de l'autre, ok.
Non. La méthode est ajoutée au type Apple, Fruit est ascendant de Apple, pas descendant, donc ne dispose pas de cette méthode. Donc tout ce qui est de type Fruit ne peut pas s'en servir.
Non, même raisonnement.
Complètement pas. Aucun objet n'a été créé avec les paramètres 2, 2, 6, alors pourquoi ça s'afficherait ?
L'exercice est difficile à suivre je suis d'accord. Mais de là à inventer des données venant de nulle part...
Et bien mon raisonnement devait être fausser :(Code:
1
2
3
4
5
6
7
8
9
10
11 ClasseA a = new ClasseA(2,2); ClasseB b = new ClasseB(4,5,6); ClasseC c = new ClasseC(70,70,70,70); a = b; a.affiche(); a = c; a.affiche(); b = c; b.affiche(); ClasseB b2 = new ClasseB(80,80,80); b2.affiche(); ClasseB b3 = new ClasseC(9,9,9,9); b3.affiche(); ClasseA a2 = (ClasseC)b3; a2.affiche(); ClasseA a3 = (ClasseC)b2; a3.affiche();
je retente
a=b;afficher(); //on met b dans une classe a on va donc généraliser ce qui fait que on perdre la 3eme valeur: 2 2
a=c;a.afficher(); //idem: 2 2
b=c;b.afficher(); 70 70 70
Non, il y a application du polymorphisme.
La variable b a été assignée avec new ClasseB(). L'objet qu'elle contient est donc de type concret ClasseB.
Comme ClasseB est une sous-classe de ClasseA, on peut assigner une variable type ClasseB à une variable de type ClasseA. C'est tout le principe des classes et de l'héritage.
Mais cela ne change strictement rien à l'objet assigné. Il ne subit aucune modification, il reste toujours le même. Il garde les mêmes propriétés et le même comportement. C'est le même, juste le même.
Cet objet étant de classe concrète ClasseB, il se comportera comme un objet de classe ClasseB.
Et donc, a.affiche() appelle la méthode affiche() de ClasseB, ce qui est en fait la même chose que ce qu'aurait fait b.affiche().
Faut réviser le cours sur le polymorphisme et la redéfinition de méthode.
... Et tu n'arriveras à rien si tu n'essaies pas de vérifier toi-même ce que disent tes cours. Un langage de programmation ne s'apprend pas qu'avec un livre. Il faut se mettre devant l'ordinateur et essayer des trucs. Ce que tu fais ne sert à rien, tu ne comprendras jamais quoi que ce soit.