J'ai le morceau de code suivant:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
Jusqu'à cette partie, le code est correct, mais je ne suis pas en mesure d'instancier «in» dans la méthode principale comme in = new Inner()
il est montré non static field cannot be referenced in static context
.
Comment puis-je le faire? Je ne veux pas rendre ma Inner
classe statique .
java
static
inner-classes
Victor Mukherjee
la source
la source
Réponses:
Vous devez également avoir une référence à l'autre classe externe.
Si Inner était statique alors ce serait
la source
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Classes imbriquéesUne classe interne «régulière» a un pointeur caché (implicite) vers une instance de classe externe. Cela permet au compilateur de générer le code pour poursuivre le pointeur pour vous sans que vous ayez à le taper. Par exemple, s'il y a une variable «a» dans la classe externe, alors le code de votre classe interne peut simplement faire «a = 0», mais le compilateur générera du code pour «externalPointer.a = 0» en maintenant le pointeur caché sous les couvertures.
Cela signifie que lorsque vous créez une instance d'une classe interne, vous devez avoir une instance d'une classe externe à laquelle la lier. Si vous effectuez cette création dans une méthode de la classe externe, le compilateur sait utiliser "this" comme pointeur implicite. Si vous souhaitez créer un lien vers une autre instance externe, vous utilisez une syntaxe "nouvelle" spéciale (voir l'extrait de code ci-dessous).
Si vous rendez votre classe interne "statique", alors il n'y a pas de pointeur caché et votre classe interne ne peut pas référencer les membres de la classe externe. Une classe interne statique est identique à une classe régulière, mais son nom est limité à l'intérieur du parent.
Voici un extrait de code qui illustre la syntaxe de création de classes internes statiques et non statiques:
la source
Si vous souhaitez créer à
new Inner()
partir d'une méthode, faites-le à partir d'une méthode d'instance de la classeMyClass
:la source
Alexei Kaigorodov est la bonne réponse. Sa solution vous permet d'instancier des classes internes à partir d'une méthode statique, telle qu'un main () de la même classe. Sinon, vous ne pouvez pas instancier une classe interne dans une méthode statique. Il ne compile pas. La solution d'Alexei compile et vous permet d'instancier des classes internes à partir d'une méthode statique. Les autres réponses sont des notes d'accompagnement intéressantes, mais je ne les trouve pas adaptées à la question réelle.
la source