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

我有以下代码:

public class MyClass {


class Inner {
int s, e, p;
}


public static void main(String args[]) {
Inner in;
}
}

到这一部分代码是好的,但是我不能在主方法中实例化‘ in’,比如 in = new Inner(),因为它显示的是 non static field cannot be referenced in static context

什么是我可以做到这一点的方式? 我不想让我的 Inner静电干扰

97205 次浏览

您还必须具有对其他外部类的引用。

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

如果“内心”是静态的,那么它就是

Inner inner = new MyClass.Inner();

如果您想要从一个方法中创建 new Inner(),那么可以从类 MyClass的一个实例方法中创建:

public void main(){
Inner inner = new Inner();
}


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

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

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

如果您使您的内部类“静态”,那么没有隐藏的指针,您的内部类不能引用外部类的成员。静态内部类与常规类相同,但其名称的作用域在父类中。

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

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


}


}

阿列克谢 · 凯戈罗多夫的答案是正确的。他的解决方案允许您从静态方法(如同一个类的 main ())中实例化内部类。否则,不能在静态方法中实例化内部类。它不能编译。Alexei 的解决方案确实可以进行编译,并且允许您从静态方法实例化内部类。其他的答案都是有趣的旁注,但我发现它们对实际问题没有反应。

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