2 qq 22857883 qq_22857883 于 2016.02.18 17:07 提问

无法从上下文中引用非静态变量(初学者)

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();
}

}

4个回答

leilba
leilba   Rxr 2016.02.18 17:26
已采纳

静态内部类的用法,你想要在类的静态方法中使用内部类的话,那么需要将内部类定义成静态的,不然是找不到内部类的,因为不声明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();
    }
}
qq_22857883
qq_22857883 这个方法也能成功,多谢啊
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.18 17:09


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外面

qq_22857883
qq_22857883 试验了一下,确实成功了,多谢指导啊
接近 2 年之前 回复
qq_22857883
qq_22857883 试验了一下,确实成功了,多谢指导啊
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.18 17:29

因为B类是TestExtend类的内部类,而内部类定义语法是要求有宿主对象的,修正
TestExtend outer=new TestExtend();
B b=outer.new B();

qq_22857883
qq_22857883 试了还不行呢,把A和B提到外面就成功了,多谢指导啊
接近 2 年之前 回复
qq_20039385
qq_20039385   2016.02.18 17:29

class A和class B是一个内部类,内部类就相当于类的属性,java在静态方法内不能访问非静态属性和非静态方法。你可以吧你的mian方法改成
public static void main (String[] args) {
B b = new TestExtend ().new B(); --错误行,这行代码有问题
b.f();
}
但要注意访问权限。

qq_22857883
qq_22857883 多谢解答
接近 2 年之前 回复
qq_20039385
qq_20039385 追加:java在静态方法内不能直接访问非静态属性和非静态方法
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!