Comment instancier une classe interne non statique dans une méthode statique

J’ai le morceau de code suivant:

public class MyClass{ class Inner{ int s,e,p; } public static void main(Ssortingng args[]){ Inner in; } } 

Jusqu’à cette partie, le code est correct, mais je ne suis pas capable d’instancier ‘in’ dans la méthode principale comme in=new Inner() car il montre qu’un non static field cannot be referenced in static context . Comment puis-je le faire? Je ne veux pas rendre ma classe Inner statique.

Vous devez également avoir une référence à l’autre classe externe.

 Inner inner = new MyClass().new Inner(); 

Si Inner était statique alors ce serait

 Inner inner = new MyClass.Inner(); 

Une classe interne “régulière” a un pointeur caché (implicite) sur une instance de classe externe. Cela permet au compilateur de générer le code pour poursuivre le pointeur sans que vous ayez à le taper. Par exemple, s’il y a une variable “a” dans la classe externe, le code de votre classe interne peut simplement faire “a = 0”, mais le compilateur va générer du code pour “outerPointer.a = 0” en conservant 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 pour la lier. Si vous faites 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, utilisez une nouvelle syntaxe (voir l’extrait de code ci-dessous).

Si vous faites en sorte que votre classe interne soit “statique”, il n’y a pas de pointeur caché et votre classe interne ne peut pas faire référence à des membres de la classe externe. Une classe interne statique est identique à une classe régulière, mais son nom est défini dans le parent.

Voici un extrait de code qui illustre la syntaxe permettant de créer des classes internes statiques et non statiques:

 public class MyClass { int a,b,c; // Some members for MyClass static class InnerOne { int s,e,p; void clearA() { //a = 0; Can't do this ... no outer pointer } } class InnerTwo { //MyClass parentPointer; Hidden pointer to outer instance void clearA() { a = 0; //outerPointer.a = 0 The comstackr generates this code } } void myClassMember() { // The comstackr knows that "this" is the outer reference to give // to the new "two" instance. InnerTwo two = new InnerTwo(); //same as this.new InnerTwo() } public static void main(Ssortingng args[]) { MyClass outer = new MyClass(); InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope } } 

Si vous voulez créer un new Inner() depuis une méthode, faites-le à partir d’une méthode d’instance de la classe MyClass :

 public void main(){ Inner inner = new Inner(); } public static void main(Ssortingng args[]){ new MyClass().main(); } 

Alexei Kaigorodov est la bonne réponse. Sa solution vous permet d’instancier des classes internes à partir d’une méthode statique, telle que main () de la même classe. Sinon, vous ne pouvez pas instancier une classe interne dans une méthode statique. Il ne comstack pas. La solution d’Alexei comstack et vous permet d’instancier les classes internes à partir d’une méthode statique. Les autres réponses sont des notes secondaires intéressantes, mais je ne les trouve pas sensibles à la question.

 import java.awt.Graphics; import java.awt.Color; import javax.swing.JPanel; import javax.swing.JFrame; public class Example { public class InnerClass extends JPanel { public void paint(Graphics g) { g.setColor(Color.BLACK); g.fillRect(getX(),getY(),getWidth(),getHeight()); g.setColor(Color.RED); g.fillRect(5, 20, 195, 20); g.setColor(Color.BLACK); g.drawSsortingng("This was written by an inner class.", 10, 35); } } public void demonstrate() { InnerClass sc = new InnerClass();//< ---this is key JFrame jf = new JFrame(); jf.add(sc); jf.setSize(220, 130); jf.setLocation(450, 450); jf.show(); } public static void main(String[] params) { Example e = new Example();//<---so is this e.demonstrate();//<---and this is also key } }