Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what's the class and field order of loading in java?

Tags:

java

class

the java source code like:

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";
}

why the result is:white?

like image 289
liuzhijun Avatar asked Jun 14 '13 11:06

liuzhijun


2 Answers

Please see the JLS

6.4.2. Obscuring

A simple name may occur in contexts where it may potentially be interpreted as the name of a variable, a type, or a package. In these situations, the rules of §6.5 specify that a variable will be chosen in preference to a type, and that a type will be chosen in preference to a package. Thus, it is may sometimes be impossible to refer to a visible type or package declaration via its simple name. We say that such a declaration is obscured.

Under section 6.5.2. Reclassification of Contextually Ambiguous Names:

If the name to the left of the "." is reclassified as a TypeName, then:

  1. If the Identifier is the name of a method or field of the type denoted by TypeName, this AmbiguousName is reclassified as an ExpressionName.

  2. Otherwise, if the Identifier is the name of a member type of the type denoted by TypeName, this AmbiguousName is reclassified as a TypeName.

  3. Otherwise, a compile-time error occurs.

like image 126
AllTooSir Avatar answered Oct 03 '22 23:10

AllTooSir


Your inner class and static variable are named the same. It doesn't have to do anything with the order of class loading, X.Y is interpreted as an acces to the variable, not the inner class.

like image 24
André Stannek Avatar answered Oct 04 '22 01:10

André Stannek