public class Test {
class Foo {
int frob() {
return 7;
}
}
class Bar extends Foo {
@Override
int frob() {
return 8;
}
}
class Baz extends Foo {
@Override
int frob() {
return 9;
}
}
public static int quux(Bar b) {
return b.frob();
}
public static void main(String[] args) {
System.out.println(quux(new Bar()));//this line gives non-static variable this cannot be referenced from a static context
}
}
答案 0 :(得分:3)
您可以通过将嵌套类声明为 static 来解决此问题,或者通过在 Test 的实例的上下文中实例化 Bar 来解决此问题。 / p>
失败是因为(非静态) Bar 必须在现有 Test 类实例的上下文中实例化;因为 main 是静态的,所以没有这样的野兽。
答案 1 :(得分:3)
public static void main(String[] args) {
Test test = new Test();
System.out.println(quux(test.new Bar()));
}
答案 2 :(得分:2)
非静态内部类具有对封闭类实例的隐藏引用。这意味着您必须具有封闭类的实例才能创建内部类。您还必须使用一个特殊的“新”函数来正确初始化对封闭类的隐藏引用。例如,
class Outer{
class Inner{
public Inner() {
System.out.println("Hello there.");
}
}
public static void main(String args[]) {
Outer o = new Outer();
Outer.Inner i = o.new Inner();
}
}