Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

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";
}
like image 619
Faraz Avatar asked Dec 25 '12 02:12

Faraz


1 Answers

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.

like image 135
fgb Avatar answered Sep 24 '22 01:09

fgb