7

以下のJavaの例では、プログラムの出力が「オレンジ」である理由を誰かが正確に説明できますか?(これは面接の質問です)

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";
}
4

2 に答える 2

10

変数 Y は型 Y を覆い隠します。JLSを参照してください。

6.4.2. 目立たない

単純な名前は、変数、型、またはパッケージの名前として解釈される可能性があるコンテキストで発生する可能性があります。このような状況では、§6.5 の規則は、変数が型より優先して選択され、型がパッケージより優先して選択されることを指定します。したがって、可視型またはパッケージ宣言を単純な名前で参照できない場合があります。そのような宣言は隠されていると言います。

修飾名 XYZ は、次のように解決されます。

6.5.2. 文脈があいまいな名前の再分類

...

「。」の左側の名前の場合。TypeName として再分類された場合:

  • Identifier が TypeName で示される型のメソッドまたはフィールドの名前である場合、この AmbiguousName は ExpressionName として再分類されます。

  • それ以外の場合、Identifier が TypeName によって示される型のメンバー型の名前である場合、この AmbiguousName は TypeName として再分類されます。

  • そうしないと、コンパイル時エラーが発生します。

型と変数の通常の命名規則のため、これが実際に発生する可能性はほとんどありません。

于 2012-12-25T02:43:19.870 に答える
3

Yという名前のWの静的インスタンスでクラスYを隠しています。クラスYはまだそこにあり、使用できます。試す:

System.out.println(X.Y.Z);
System.out.println((new X.Y()).Z);

出力は

Orange
Apple

参照: Java フィールドの非表示

于 2012-12-25T02:29:15.823 に答える