静态嵌套类,静态属性访问。脑筋急转弯

时间:2013-11-24 12:56:22

标签: java static field

有人可以解释一下为什么在这个片段中对X.Y.Z的调用相当于C.Z? 调用X.Y.Z意味着: - 它静态访问X类 然后 - 属性Y-类型C-(不是Y类) 然后 - C中的属性Z导致输出“生命就是痛苦”。

但为什么调用X.Y会访问属性而不是类? 这背后的理论是什么?

public class A {
    public static class X {
        public static class Y {
            public static String Z = "life is good";
        }
        public static C Y; 
    }

    public static class C {
        public static String Z = "life is pain";
    }

    public static void main(String[] args) { 
        System.out.println(X.Y.Z);
    }
}

感谢您的时间

3 个答案:

答案 0 :(得分:2)

没有什么特别有趣的,它归结为JLS指定的名称解析过程中的优先顺序。名称X.Y不明确,两个选项中的一个必须优先。

如果你真的对血腥细节感兴趣,那么主题就有whole chapter in the JLS(我的猜测是,一旦你意识到你已经打开了一个黄蜂巢,你的兴趣会很快消失:)

答案 1 :(得分:1)

静态类和静态属性完全是两个不同的东西。像你所做的那样只调用类变量。类成员class Y的{​​{1}}不是A的变量。

实际上,静态类与任何其他类一样。唯一的区别是它没有自己的C Y文件,并且它与包含类在逻辑上相关。但就是这样。 如果明天你从.java中取出class Y,那么任何事情都不会中断(假设您更改了class A之类的地方)。另一方面,变量A.Y myY = new A.Y();public static C Y;的一部分。

答案 2 :(得分:0)

因为您有名称冲突,如果您允许java编译器使用构造函数推断出正确的名称冲突(例如System.out.println(new X.Y().Z);它可以工作)。