2015-11-16 117 views
0

下产生一个错误:静态嵌套类的(实例)可以访问外部静态变量吗?

class A { 

    static int apple = 5; 

    static class StaticNestedSubClassOfA { 
    //... 
    } 
} 

class Test { 

    public static void main(String str[]) { 
    A.StaticNestedSubClassOfA b = new A.StaticNestedSubClassOfA(); 
    System.out.println("Apple: " + b.apple); 
    } 
} 

ERROR:

Test.java:14: error: cannot find symbol 

     System.out.println("Apple: " + b.apple); 

        ^

    symbol: variable apple 

    location: variable b of type StaticNestedSubClassOfA 

    1 error 

但不StaticNestedSubClassOfA访问静态变量apple? (我想这并不意味着从StaticNestedSubClassOfA催生对象访问apple通过他们的情况?)

+0

为什么不把它称为'A.apple',而不考虑上下文? – rgettman

+0

'StaticNestedSubClassOfA'可以访问'A.apple',但这不是你想要做的。您正尝试从类型为'StaticNestedSubClassOfA'的参考表达式中访问名为'apple'的字段。 –

回答

0

您在类Test访问的A.apple这没有工作的机会。

当编译A时,它不知道如何从所有可能的类访问它,并且无法生成使其工作所需的访问方法。

JVM不允许访问类之间的私有成员。相反,javac编译器会在外部类下的同一个java类文件中添加访问方法。这就是为什么你有时会在调用堆栈中看到像access$200这样的方法。一个类通过生成的访问器方法访问另一个类的私有成员。如果你在一个不相关的类中,你不能访问私有字段,也不能在没有提前创建所有可能的访问器的情况下为你实现这样做的方式(它不这样做)

0

这是只有这样我才能想到得到这个工作。

public class Outer 
{ 
    private static int apples = 5; 

    public static class Inner { 
     public int getApples() { return Outer.apples; } 
    } 

    public static void main(String[] args) { 
     Outer.Inner inner = new Outer.Inner(); 
     System.out.println(inner.getApples()); 
    } 
} 

至于运行时而言,OuterInner是两个独立的类。它们嵌套的想法是编译器维护的虚构。因此,在运行时,编译器无法通过使用Inner来访问Outer

,因为它们共享一个范围,但是,编译确实允许Inner访问Outer私有方法和字段。但是如果没有运行时的帮助,编译器可以解决这个问题。其他技巧,比如你试图做的直接按名字访问字段是不可能的。

相关问题