在java中加载的类和字段顺序是什么?

时间:2013-06-14 11:25:02

标签: java class

java源代码如:

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


class X { 
    static class Y{
       static String Z = "balck";
    }   

    static C Y  = new C();
}

class C{
    String Z = "white";
}

为什么结果是:white

4 个答案:

答案 0 :(得分:10)

请参阅JLS

  

6.4.2。模糊

     

一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称。在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称引用可见类型或包声明。我们说这样的声明是模糊不清的。

6.5.2. Reclassification of Contextually Ambiguous Names部分下:

  

如果名称在“。”左侧。被重新分类为TypeName,然后:

     
      
  1. 如果Identifier是TypeName表示的类型的方法或字段的名称,则此AmbiguousName将重新分类为ExpressionName。

  2.   
  3. 否则,如果Identifier是TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName。

  4.   
  5. 否则,会发生编译时错误。

  6.   

答案 1 :(得分:4)

您的内部类和静态变量的名称相同。它不必对类加载的顺序做任何事情,X.Y被解释为对变量的访问,而不是内部类。

答案 2 :(得分:4)

结果为white,因为您的命名惯例非常糟糕

无论其他人会给你什么技术原因,甚至考虑问题的唯一原因是你以这样的方式命名你的变量,你自己和所有其他人将无法阅读和理解。唯一没有问题的是编译器,它的定义严格到足以知道该怎么做。

答案 3 :(得分:2)

这是一个棘手的问题。从不使用类Ystatic C Y = new C();是名为Y的C类实例,与类Y

无关