What happens when a Static Variable has the same name as a Static Class in Java?

前端 未结 2 1762
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-06 07:33

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         


        
相关标签:
2条回答
  • 2020-12-06 08:13

    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.

    0 讨论(0)
  • 2020-12-06 08:30

    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

    0 讨论(0)
提交回复
热议问题