Je suis ignoré pourquoi cela est autorisé mais ce n'est pas autorisé p> le compilateur informé qu'il ne pouvait pas référence à FOOEY .Cefois avant que le constructeur de Supertype a été appelé. p> et cela est autorisé p> Que se passe-t-il ici? Et où puis-je aller pour trouver plus d'informations sur la fonctionnement de l'héritage de la classe interne? P>
4 Réponses :
Je suppose que les JLS et les réponses à cette question sont un point de départ p>
Tout d'abord: ne faites pas ce genre de chose. C'est mal. Vraiment, Java 1.1 aurait dû être spécifié beaucoup plus restrictivement, imo.
Il existe une confusion sur laquelle La solution doit être explicite. Explicite est généralement une bonne chose dans mon livre (à moins que cela ne devienne chaude). P> meilleur encore, ne pas avoir une classe intérieure étendre sa propre classe extérieure ou prolonger tout Classe intérieure. P> P> ceci code> à utiliser à partir du constructeur
foo.fooey code>. L'extérieur ceci (
foo.C'est code>) fonctionnerait. Mais le
tel code> est un
foo code> mais il ne peut pas être transmis au SuperConstructeur en raison de règles concernant l'utilisation de
Ceci code> avant le retour du SuperConstructeur (et En plus d'avoir une instance extérieure, le même instance que l'instance interne est classée). L'extérieur ceci sur la superclasse "
((bar) ceci) .Ce 0 $ 0 code>" (IIRC), est également inaccessible en raison de restrictions à l'utilisation de
Ceci p>
+1 pour votre première remarque. Si vous devez explicitement créer un constructeur, car le par défaut ne compile pas, je dirais que vous le faites mal (conception sage).
Tom, merci pour la réponse. Je suis venu sur les deux idées plutôt mauvaises; La classe interne étend la classe extérieure et la classe interne étend une autre classe interne statique. Je n'étais pas sûr de ce qui se passait.
La réponse Tom Hawtin est correcte. p>
a également consulté Java Puzzler . Le chapitre d'échantillon contient ce cas et quelques autres cas "intéressants" que vous voudrez peut-être jeter un coup d'œil à. P>
(ne peut pas encore commenter - j'ai besoin de 50 représentant) p>
Je suis aussi ignoré que cela est autorisé. Une classe interne (non statique) d'une classe extérieure est en fait un membre de cette classe externe. Lire: un objet intérieur est un membre de son objet extérieur. (Incidemment, chaque objet extérieur doit posséder un objet intérieur, mais c'est en plus le point.) P>
L'analogie que j'aime utiliser est ceci: Soit Maintenant, il ne fait pas de sens conceptuel pour une classe interne pour prolonger une classe extérieure. Je ne peux pas penser à des situations du monde réel qui appellent qu'un objet étant à la fois membre et un type d'un autre objet. Définir les théoriciens rappellera le axiome de la régularité em> et ses conséquences. p>
Pensez-y de cette façon: Laissez ou retour à l'analogie précédente, vous ne devez pas laisser Je suis fâché que ceci est légal et ne produit pas d'erreur de compilation. P> voiture code> être la classe extérieure et laisser
roue code> être la classe interne. Chaque instance de
voiture code> doit, et fait, avoir au moins une instance de la roue code> en tant que membre. P>
honda code> étendre
voiture code> et laisse
honda code> être une classe intérieure nichée à l'intérieur
voiture code>. Ce que vous dites ici, c'est que chaque
honda code> objet
voiture code> objet (DUH) et chaque
voiture code> objet
honda code>. Une seule de ces déclarations a du sens, mais les deux sont autorisées à être vraies en Java. P>
roue code> étendre
voiture code> car une roue code> code> sera fort> A
voiture code>, et par définition doit
Voiture code> et donc doit avoir une roue forte>
code> et pour toujours et jamais amen. La construction d'un objet code> voiture code> entraînerait une boucle infinie d'objets imbriqués. P>
Imaginez à quel point vous seriez contrarié si vous l'avez vu dans le code de production!
Si Honda étend la voiture, il fait pas i> que chaque objet de voiture a un objet Honda.
@Ray: Oui, mais si Honda est imbriquée à l'intérieur de la voiture (A.k.a. un "membre" de la voiture), il fait i> chaque objet de voiture a un objet Honda.
Pas vrai. Si Honda est une classe interne de voiture, un objet de voiture n'a pas nécessairement un objet Honda. D'autre part, un objet Honda doit avoir une référence à l'objet de voiture parent. Vous devez être capable de différencier entre une classe membre et une variable membre.
Compris. Serais-je correct en supposant qu'un objet de voiture ait un objet honda uniquement si la classe code> voiture code> contient la ligne: Honda Accord privé; code>?
Consultez cette question, à peu près sûr que cela duplique: Stackoverflow.com/questions/70324/...
Pas une dupe (du moins pas de celui-ci).
Quelle est l'utilisation d'une instance externe d'une classe que vous extensionnez?
@Jorn, je suis venu sur les deux problèmes lorsque vous souhaitez refacturer l'ancien code. Oui, quelque chose que terrible était dans un environnement de production.