问题描述
- 无法从上下文中引用非静态变量(初学者)
-
public class TestExtend {
class A {
protected void print(String s){
System.out.println(s);
}
A() {print("A()");}
public void f() {print("A:f()");}
}class B extends A {
B() {print("B()");}
public void f() {print("B:()");}}
public static void main (String[] args) {
B b = new B(); --错误行,这行代码有问题
b.f();
}}
解决方案
静态内部类的用法,你想要在类的静态方法中使用内部类的话,那么需要将内部类定义成静态的,不然是找不到内部类的,因为不声明static的话,内部类只会在TestExtend对象创建之后才会生成。你可以试一下如下的代码:
public class TestExtend {
static class A {
protected void print(String s){
System.out.println(s);
}
A() {print("A()");}
public void f() {print("A:f()");}
}
static class B extends A {
B() {print("B()");}
public void f() {print("B:()");}
}
public static void main (String[] args) {
B b = new B();
b.f();
}
}
解决方案二:
把
class A {
protected void print(String s){
System.out.println(s);
}
A() {print("A()");}
public void f() {print("A:f()");}
}
class B extends A {
B() {print("B()");}
public void f() {print("B:()");}
}
放在
public class TestExtend外面
解决方案三:
因为B类是TestExtend类的内部类,而内部类定义语法是要求有宿主对象的,修正
TestExtend outer=new TestExtend();
B b=outer.new B();
解决方案四:
class A和class B是一个内部类,内部类就相当于类的属性,java在静态方法内不能访问非静态属性和非静态方法。你可以吧你的mian方法改成
public static void main (String[] args) {
B b = new TestExtend ().new B(); --错误行,这行代码有问题
b.f();
}
但要注意访问权限。