如何在静态方法中实例化非静态内部类

我有以下一段代码:

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

用这部分代码是好的,但我不能像main in=new Inner()方法中实例化'in',因为它显示了non static field cannot be referenced in static context 。 我能做到的方式是什么? 我不想让我的内部类是静态的。

你必须有一个对其他外部类的引用。

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

如果内在是静态的,那就是了

 Inner inner = new MyClass.Inner(); 

一个“常规”的内部类有一个隐藏的(隐式)指向外部类的实例。 这允许编译器生成代码来追逐指针,而不必键入它。 例如,如果在外部类中有一个variables“a”,那么内部类中的代码可以只执行“a = 0”,但是编译器会生成代码“outerPointer.a = 0”封面。

这意味着当你创build一个内部类的实例时,你必须有一个外部类的实例来链接它。 如果你在外部类的一个方法中做这个创build,那么编译器知道使用“this”作为隐式指针。 如果你想链接到一些其他的外部实例,那么你使用一个特殊的“新”语法(见下面的代码片段)。

如果你让你的内部类是“静态的”,那么没有隐藏的指针,你的内部类不能引用外部类的成员。 静态内部类与普通类相同,但名称在父级内部。

下面是代码片段,演示了创build静态和非静态内部类的语法:

 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 classes you have to spell out the scope } } 

如果你想从一个方法中创buildnew Inner() ,可以从类MyClass一个实例方法中完成:

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

阿列克谢Kaigorodov是正确的答案。 他的解决scheme允许您从一个静态方法(如同一个类的main())中实例化内部类。 否则,你不能在一个静态方法中实例化一个内部类。 它不编译。 阿列克谢的解决scheme不会编译,它允许您从静态方法实例化内部类。 其他的答案是有趣的旁注,但我没有发现他们对实际问题的回应。

 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 } }