静态嵌套类,静态属性访问.Brain Teaser



有人能解释一下为什么在这个片段中对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);
    }
}

感谢您抽出时间

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

如果你真的对血腥的细节感兴趣,JLS中有一整章都是关于这个主题的(我猜,一旦你意识到自己打开了一个多么大的马蜂窝,你的兴趣就会很快减弱:)

静态类和静态属性完全是两个不同的东西。像您所做的那样进行调用只引用类变量。class Y不是A的变量,而类成员C Y是.

事实上,静态类和其他类一样。唯一的区别是它没有自己的.java文件,并且它在逻辑上与包含类相关。但就是这样。如果明天你把class Yclass A中去掉,就不会有任何东西坏掉(假设你改变了你做过类似A.Y myY = new A.Y();的事情的地方)。另一方面,变量public static C Y;class A的一部分。

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

最新更新