2016-12-23 9 views
8

私はLearning JavaのInnerクラスについて読んでいました。私は、javap 'Animal$Brain'は内部クラスが内部クラスのコンストラクタに、その封入インスタンスへの参照を取得する方法について説明Javaの内部クラス

Compiled from "Animal.java"class 
Animal$Brain { 
    final Animal this$0; 
    Animal$Brain(Animal); 
} 

として出力を与え、コンパイルした後、このコード

class Animal{ 
    class Brain{ 
    } 
} 

を発見しました。しかし、私はこの

class Animal{ 
    private class Brain{ 
    } 
} 

のようなプライベートとして内部クラスを定義するときにコンパイルした後、javap 'Animal$Brain'

Compiled from "Animal.java" 
class Animal$Brain { 
    final Animal this$0; 
} 

として出力を与える、なぜ出力が違うのですか? 内部クラスのコンストラクタが表示されないのはなぜですか? 後者の場合も、内部クラスはクラスインスタンスを囲む参照を取得しています。

+1

私は、クラスのパブリックコンストラクタがなくなっていると思います(新しいAnimal()、新しいBrain();は現在外部で行うことはできません)。 – Rogue

答えて

7

良い質問です。オプションを指定しない場合this

によると、パッケージ、保護、およびpublicフィールドと

に渡されたクラスのメソッド出てjavapプリントプライベート内部クラスとしてBrainを宣言しているので、そのデフォルトのコンストラクタは暗黙的にプライベートにされるため、Animalクラスの外側には表示されません。

参考:デフォルトではhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9

+0

javapは渡されたクラスのデフォルト、保護された、公開のフィールドとメソッドを出力するので、内部クラスコンストラクターは印刷されないので、内部クラスコンストラクターはprivateです。 –

+1

はい、回答を編集しました – code

1

、クラスの非プライベートメンバーを印刷してjavap。

-pオプションを使用すると、すべてのクラスとメンバーを表示できます。

//javap -p 'Animal$Brain.class' 

Compiled from "Animal.java" 
class Animal$Brain { 
    final Animal this$0; 
    private Animal$Brain(Animal); 
} 
関連する問題