12

次のコード スニペットでは、おそらく何らかのコンパイル エラーが発生するように見えますが、そうではありません。

class Outer {
    public static class Inner {
        static String obj = "Inner";
    }

    static Optional Inner = new Optional();
    //The (inner) class name and the object name are same.
}

class Optional {
    String obj = "Optional";
}

public class Main {

    public static void main(String[] args) {
        System.out.println(Outer.Inner.obj);
        //Refers to the string inside the optional class
    }
}

このクラスOuterには、その中に という名前の静的クラスがありますInner。さらに、クラスのオブジェクト (静的) を宣言しますOptional( static Optional Inner = new Optional();)

このオブジェクトとクラス名 ( class 内Outer) は同じですInner。プログラムが表示されますOptionalOuter.Inner.obj内の唯一の式main()が表示されることが期待されますInnerが、表示されません。ただし、実際の出力はクラスOptionalの場合です。Optional

表示する 1 つの方法Innerは、オブジェクト名を別のものに変更することです。

static Optional Inner1 = new Optional();

表示される出力から、型名 ( class Inner) よりもオブジェクト名 (または変数) が選択されているように見えます。それらは同じ名前を持っているからです。ここで適用される正確なケースは何ですか?

4

3 に答える 3

3

実際のクラス名は Outer$Inner です。

内部クラスは、基本的に Java 1.1 で導入されたハックです。JVMには実際には内部クラスの概念がないため、コンパイラーはそれを邪魔する必要があります。コンパイラは、 class の「外部」であるが同じ package 内にクラスを生成 B、合成アクセサー/ コンストラクターをそれに追加して、それにアクセスできるようにします。A A

次の投稿をチェックしてください。

Java 内部クラス可視化パズル

于 2012-10-17T09:35:03.797 に答える
2

内部クラスが実際に独自の .java ファイルを持っていると考えてください。これにより、Inner クラスよりも変数を選択する理由が明確になります。

于 2012-10-17T09:39:40.083 に答える