Come istanziare una class interna non statica all’interno di un metodo statico

Ho il seguente codice:

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

Fino a questa parte il codice va bene, ma non sono in grado di istanziare “dentro” all’interno del metodo principale come in=new Inner() poiché mostra che il non static field cannot be referenced in static context . Qual è il modo in cui posso farlo? Non voglio rendere statica la mia class interna.

Devi avere anche un riferimento all’altra class esterna.

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

Se Inner fosse statico, lo sarebbe

 Inner inner = new MyClass.Inner(); 

Una class interna “normale” ha un puntatore (implicito) nascosto a un’istanza di class Outer. Ciò consente al compilatore di generare il codice per inseguire il puntatore per te senza doverlo digitare. Ad esempio, se c’è una variabile “a” nella class esterna, il codice nella tua class interna può semplicemente fare “a = 0”, ma il compilatore genererà il codice per “outerPointer.a = 0” mantenendo il puntatore nascosto sotto le copertine.

Ciò significa che quando crei un’istanza di una class interna devi avere un’istanza di una class esterna a cui collegarla. Se si esegue questa creazione all’interno di un metodo della class esterna, il compilatore sa usare “this” come puntatore implicito. Se vuoi collegarti ad un’altra istanza esterna, usi una syntax “nuova” speciale (vedi lo snippet di codice sotto).

Se rendi la tua class interiore “statica”, allora non c’è alcun puntatore nascosto e la tua class interiore non può fare riferimento ai membri della class esterna. Una class interna statica è identica a una class regolare, ma il suo nome è presente all’interno del genitore.

Ecco un frammento di codice che dimostra la syntax per la creazione di classi interne statiche e non statiche:

 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 compiler generates this code } } void myClassMember() { // The compiler 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(String 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 classs you have to spell out the scope } } 

Se vuoi creare un new Inner() da un metodo, fallo da un metodo di istanza della class MyClass :

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

Alexei Kaigorodov è la risposta giusta. La sua soluzione consente di istanziare le classi interne da un metodo statico, come un main () della stessa class. Altrimenti, non è ansible creare un’istanza di una class interna all’interno di un metodo statico. Non viene compilato. La soluzione di Alexei si compila e ti consente di istanziare le classi interne da un metodo statico. Le altre risposte sono interessanti note a margine, ma non le trovo rispondenti alla domanda vera e propria.

 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.drawString("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 } }