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 {
p
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.
You're hiding the class Y with a static instance of W named Y. The class Y is still there and can be used. Try:
System.out.println(X.Y.Z);
System.out.println((new X.Y()).Z);
The output should be
Orange
Apple
Also see: Java Field Hiding