Java Inner Class étend la classe externe
Dans certains cas, de Java où un intérieur classe étend extérieur de la classe.
Par exemple, java.awt.geom.Arc2D.Float est un intérieur de classe de java.awt.geom.Arc2D,
et s'étend également Arc2D.
(c.f. http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.html)
Aussi, le soleil.org.mozilla.le javascript.interne.FunctionNode.Saut s'étend soleil.org.mozilla.le javascript.interne.Nœud, qui est une super-classe de FunctionNode.
(désolé... impossible de trouver un lien vers la javadoc)
Pour moi, cela me semble bizarre. Pourriez-vous ensuite de créer ces?
new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;
new FunctionNode.Jump.Jump.Jump(1); //I could get this to compile
Quel but a-t-elle d'avoir une sous-classe imbriquée à l'intérieur d'une classe de super-classe?
Je me demandais si c'était d'accéder à quelque chose dans la super-classe, mais si vous voulez accéder à toutes les variables/méthodes dans le parent, vous pouvez utiliser
super.variable;
ou
super.method();
Edit 1:
jjnguy a proposé c'est de garder la logique dans le même endroit. Dans ce cas, pourquoi ne pas vous écrire un fichier com.mypackage.AbstractTest:
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
... au lieu de:
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
Edit 2:
Il a été, à juste titre souligné que la suggestion de mon édition précédente a été entaché d'irrégularités, comme il ne pouvait pas construire ExtensionTest à l'extérieur de l'emballage. Cependant, j'ai eu un encore penser à propos de ce cours du week-end, ainsi que sur les éléments suivants:
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
En essence, la meilleure réponse que j'ai vu jusqu'à présent est que le fait d'avoir un intérieur de classe étendre l'extérieur de la classe permet à la logique de les regrouper. Cependant, je pense que cela peut être fait sans l'extension.
Dans mon esprit, il semble que mauvais design afin d'avoir une classe qui peut avoir un nombre infini d'un même sous-classes imbriquées. (Contexte: c'est venu tout en essayant de produire un dictionnaire pour un code d'achèvement de l'utilitaire, et jeta un StackOverflowException. J'ai trouvé une solution de contournement, mais je n'arrive pas à comprendre pourquoi il avait été conçu de cette façon.)
source d'informationauteur amaidment
Vous devez vous connecter pour publier un commentaire.
Ont un coup d'oeil à Java
Point2D
. Il dispose de deux classes internes qui sont des sous-classes.La chose importante à noter est qu'ils sont
static
intérieur des classes. Cela a une toute diffenent sens que régulièrement intérieur de la classe. Tout comme une méthode statique, une classe statique est définie au niveau de la classe à la place de l'objet.Dans le
Point2D
cas, il est fait logiquement couple les classes et de leur logique. Il permet à un utilisateur de laabstract
typePoint2D
trouver une mise en œuvre qu'ils peuvent utiliser.En réponse à votre travail d'édition, je tiens à souligner 1 fait important. Un seul fichier Java ne peut contenir qu'une seule classe publique, sauf pour le public à l'intérieur des classes. Alors que les deux exemples peuvent compiler, ils ne permettent pas l'accès à ces classes pour le public. Si vous souhaitez présenter plusieurs classes publics à quelqu'un dans un seul fichier, vous devez utiliser les transports en statique à l'intérieur des classes.
Il y a deux cas de inner-classes:
statique inner-classes. À l'intérieur de la classe ne pas garder de référence à l'extérieur de la classe.
non-statique inner-classes. À l'intérieur de la classe ne de conserver une référence à l'extérieur de la classe.
Le cas d'une statique à l'intérieur de la classe qui s'étend à l'extérieur de la classe n'est pas aussi intéressant que le non-statique à l'intérieur de la classe étendant de l'extérieur de la classe.
Ce qui se passe avec ce dernier: pour créer à l'intérieur de la classe, on a besoin d'une référence à l'extérieur de la classe. Cependant, comme l'intérieur de la classe est une instance de l'extérieur de la classe, il accepte aussi une référence à une autre instance de l'intérieur de la classe, à être utilisé pour l'extérieur de la classe.
Regardons quelques code:
Si vous connaissez la générateur de modèlecela peut être utilisé afin d'avoir une programmation orientée objet-version:
Qui est utilisé comme:
new Command.StartComputer().new OpenNotepad().new ShutdownComputer().perform();
.Il y a une 1ère compile très bien sur mon IntelliJ.
À proprement parler, membre statique des classes ne sont pas les classes internes. Ils sont appelés imbriquée classes.