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
?
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:
If the Identifier is the name of a method or field of the type denoted by TypeName, this AmbiguousName is reclassified as an ExpressionName.
Otherwise, if the Identifier is the name of a member type of the type denoted by TypeName, this AmbiguousName is reclassified as a TypeName.
Otherwise, a compile-time error occurs.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With