In the java example below, can anyone explain exactly why the output of the program is "Orange" ? (this is an interview question)
public class Finder {
public static void main(String[] args){
System.out.println(X.Y.Z);
}
}
class X {
static W Y = new W();
static class Y {
static String Z ="Apple";
}
}
class W {
String Z = "Orange";
}
The variable Y obscures the type Y. 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.
The qualified name X.Y.Z is resolved according to:
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.
This is unlikely to occur in practice because of the normal naming conventions for types and variables.
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