10

次のコードを書きました

public class Reader1 {
    private int pageNumber;

    private class ReaderName1{
        public int getPage(){
        return pageNumber;
        }
    }
    static class ReaderFound{

    }
}

取得したコンパイル済みコードで Java クラス ファイル逆アセンブラー javap を使用したとき

1. for Reader1.class



class Reader1$ReaderName1 {
              final Reader1 this$0;
              private Reader1$ReaderName1(Reader1);
              public int getPage();
            }


2. for Reader1$ReaderName1.class



    public class Reader1 {
          private int pageNumber;
          public Reader1();
          static int access$000(Reader1);
        }

3. for Reader1$ReaderFound.class



     class Reader1$ReaderFound {
          Reader1$ReaderFound();
        }

私の質問は、 ReaderFound は静的クラスであるため、どのようにデフォルトのコンストラクターを持つことができますか? もしそうなら、なぜですか?許可されていますか?

静的にすることができないため、クラス Reader1$ReaderFound 内にあるコンストラクタの種類が許可されている場合。(また、コンストラクターはオブジェクトを初期化するために暗黙的に呼び出され、ReaderFound は静的クラスであるため、そのオブジェクトはありません。最初の質問に対する私のポイント)

4

1 に答える 1

15

Java には、静的メンバー クラス、非静的メンバー クラス匿名クラス、およびローカル クラスの 4 種類のネストされたクラスがあります。

静的メンバー クラスは、別のクラス内で宣言された通常のクラスと見なすことができます。囲んでいるクラスのインスタンスをインスタンス化する必要はありません。インスタンスは必要ないため、外側のクラスのインスタンス メソッドと変数にアクセスできません。ただし、プライベートであってもクラスメンバーにアクセスできます。

class EnclosingClass {
    static class StaticMemberClass { }

    public static void main(String... args) {
        EnclosingClass.StaticMemberClass nestedInstance =
            new EnclosingClass.StaticMemberClass();
    }
}

ネストされた静的クラスであっても、そこからインスタンスを作成できないわけではありません。したがって、カスタム コンストラクターを作成しない場合は、既定のコンストラクターが作成されます。

于 2015-03-25T16:01:24.010 に答える