J'ai une classe C. Classe E l'étend.
((M) k).doIt();
9 Réponses :
juste parce que e s'étend c, c ne devient pas un e ... e d'autre part est un c p>
edit: strong> Pour développer le commentaire de Mark ci-dessous ... Juste parce que chaque femme est un humain, tous les humains ne sont pas des femmes. Tous les humains partagent l'interface humaine avec les jambes, les mains, les visages, etc. Les femmes l'étendent avec des fonctionnalités qui renvoient de bons sentiments lorsque vous fournissez des diamants et de l'or. P>
La double conversion INT => n'est même pas liée car ce n'est pas un casting de classe, mais une conversion indiquant au compilateur de stocker tout ce qui est dans X dans Y (qui se trouve être un double). P>
((m) k) .getclass () donne k. p>
blockQuote>
parce que k est toujours un k même si vous le jetez à un m ou à un objet (ou quelque chose d'autre, il se trouve être). P>
Pourquoi pas? Chaque E est un C. donc pourquoi je ne peux pas traiter un objet C comme e? Pour la deuxième partie - alors que fait le casting? Cela ne change pas la variable. Que se passe-t-il si j'exécute ((m) k) .doIt () - K's ou m's Doit () sera exécuté?
Vous pouvez aussi bien demander: chaque femme est une personne; Pourquoi ne puis-je pas traiter toutes les personnes comme une femme? Réponse: vous peut b> - mais d'abord, vous devez vérifier i> qu'ils sont une femme.
Chaque E est un c mais pas tous les C est un E. E étendre C est comme dire que c'est indiquer que e ajoute à C par conséquent, un C pourrait ne pas avoir la même quantité de choses qu'il y a un.
Merci Marc et Russ pour remplir les blancs comme des commentaires. Je ne suis pas sûr de savoir si cela signifie quelque chose pour marquer des commentaires aussi géniaux, mais je les ai accueillis une fois chacun.
@Fredrik: Vous devriez avoir envie de profiter des Atributes de Wiki, et de modifier votre réponse pour clarifier. :)
Bien sûr, je viens de sentir que les commentaires l'ont dit tout et que quiconque voyant la réponse se verra voir les commentaires.
Le RE LA QUESTION; L'objet d'un type est fixé à la création. Un objet ici, nous n'avons toujours qu'un seul objet - simplement que la variable si Nous ajoutons ensuite: P> int code> /
double code> n'est pas liée; C'est une conversion, pas un casting - il n'y a pas de relation entre
int code> et
double code>.
C code> n'est pas em> (et ne peut jamais être) un
E code>. Cependant, vous pouvez traiter em> un
E code> en tant que
C code>, car l'héritage représente "est un". Par exemple: p>
c code> y réfléchit comme un
C code >, donc ne pas exposer les méthodes spécifiques à
E code> (même si l'objet est strong> un
E code>). p>
E secondE = (E) c;
Merci. Pouvez-vous donner un exemple où e seconde = (e) c; travaillerait?
Il a juste fait ... quand vous faites: e e = nouveau e (); C c = e puis faire un e à nouveau avec "e seconde = (e) c"; Étant donné que l'objet a été un e tout le temps (même si quelqu'un l'a traité comme le C c'est-il par héritage), la troisième rangée sera parfaitement légale.
Dans le code réel BTW, la troisième ligne serait probablement à l'intérieur de certains "si (C Instance de E)". Si vous saviez tout le temps que votre C est un E, il ne serait pas logique de le jeter à un C en ligne deux.
J'aurais eu une question similaire et j'ai trouvé ce fil. Votre réponse m'a aidé à comprendre le sujet.
Pour la première question, vous ne pouvez pas lancer une superclasse à une sous-classe, car une sous-classe ajoute des membres que la superclasse n'a pas. Comment le compilateur est-il censé savoir quelles valeurs à y mettre quand il monder? Fondamentalement, un e est un c, mais un c n'est pas un e. P>
getclass () obtient le type de l'objet en mémoire. Le casting à m masque simplement le fait que c'est un k, cela ne change pas l'objet sous-jacent. P>
Vous ne pouvez pas lancer d'objets en Java. P>
Vous pouvez lancer des références en Java. P>
Casting d'une référence ne change rien sur l'objet qu'il fait référence. Il ne produit qu'une référence d'un type différent pointant vers le même objet que la référence initiale. P>
Les valeurs primitives de casting sont différentes des références de coulée. Dans ce cas, les valeurs font le changement em>. P>
Pour ajouter à la réponse de Frederik, jetant un objet à quelque chose ne change pas son type. En outre, l'objet peut seulement être jeté à un type qu'il est déjà (le compilateur ne sait pas à ce moment-là) C'est pourquoi des cases impossibles ne seront jamais acceptées:
Integer i = (Integer) new String();
Considérez un exemple réel:
public void amuseAnimals( List<Animal> animals ) { for ( Animal animal : animals ) { if ( animal instanceof Dog ) { Dog doggy = (Dog)animal; doggy.takeForWalk( new WalkingRoute() ); } else if ( animal instanceof Cat ) { Cat puss = (Cat)animal; puss.play( new BirdShapedToy() ); } } }
Pourquoi exécute-t-il DOIT de K? Je dis à faire référence à cet objet en tant que M et non à K. Si le compilateur le traite comme un M, il devrait exécuter les méthodes de M. Je suis encore plus confus maintenant. Pouvez-vous donner un exemple de casting (chien chien = (chien) myanimal) a du sens?
"Si le compilateur le traite comme un M, il devrait exécuter les méthodes de M.". Le compilateur le traite comme un M pour des raisons de taper. Si k ne peut pas être tapé comme une m, une clascastexception est lancée. Les méthodes de K sont utilisées car comme une sous-classe K peut remplacer les méthodes de M. C'est ce qui sépare une K d'un M et est une partie intrinsèque de l'orientation objet.
(m) k) .getclass () donne K. pourquoi est-ce? Il a été lancé au plus général m! P> blockQuote>
Une analogie utile (que j'ai eu du site de Bill Venners 'Artima.com) qui pourrait aider à préciser la confusion est que la différence entre les classes et les objets est comme la différence entre le plan d'architecte et la maison actuelle construite. Le plan directeur existe sur papier et est un concept, tandis que la maison existe dans la vie réelle. Vous pouvez avoir plus d'une maison construite au même plan. P>
Comment cela est-il pertinent pour cette question? Disons qu'il y ait un
McMansion Code> Blueprint et un
McMansionwithheatedpool code> Plutier. Un
McMansionWithheatedpool code> est une extension d'un
MCMansion code> avec une piscine chauffée. P>
Maintenant, si vous voyez un vrai
McMansionwithheatedpool code>, pour cet objet: p>
conceptuellement (c'est-à-dire si vous regardez les Blueprints de l'architecte), vous verriez qu'un
McMansionwithheatedpool code> est clairement également un
McMansion code>. Par conséquent, le refonte est autorisé. (Pour la même raison, un objet
McMansion CODE> ne peut pas être taper de manière à jeter dans un
McMansionwithheatedpool code>: Pas de piscine chauffée!) P> Li>
((
MCMansion (code>) k) .getclass () donne
McMansionwithheedpool code> car k est toujours un
McMansionwithheatepool code>. La fonte de type est sur l'expression, pas sur l'objet. P> li> ol>
"Si le compilateur le traite en tant que M, il devrait exécuter les méthodes de M."
Le compilateur traite la référenceforte> comme M. l'instance forte> que les points de référence sont de type k, pas M. Vous ne pouvez pas lancer la référence et supposer que signifie l'instance va soudainement changer de comportement. Ce que le compilateur est assuré que la méthode que vous invoquez sur la référence spécifiée existe. Il n'a rien à voir avec quelle mise en œuvre est invoquée, seulement qu'une implémentation existe. P> blockQuote>
Casting d'un objet ne change pas l'objet à l'objet à la distribution, mais permet une autre référence de classe qui lui est liée par héritage pour se reporter à l'objet.
par exemple Vous appelez Vous venez de dire au compilateur qu'il vous permettait de vous référer à c étend e code> . Et ils ont tous les deux une méthode
myName (); code>. Si vous dites p>
C myName () code> méthode et si vous dites également p>
E code> avec
c code> type de référence. p> p>