静的にネストされたクラス1は、アクセス修飾子に関係なく、外部クラスのすべてのメンバーにアクセスできることを除いて、外部クラスとまったく同じです。これらは外部クラスのインスタンスとは別に存在するため、外部クラスのインスタンス変数または非静的メソッドにアクセスするには、インスタンスへの参照が必要です。
非静的なネストされたクラス(内部クラスと呼ばれる)は、外部クラスのインスタンスのコンテキストでのみ存在します。構築this
されると、自動的に生成される2番目のフィールドがあり、構文を使用して内部クラス内からアクセスできますOuter.this
。内部クラスの各インスタンスは、外部クラスの単一のインスタンスで囲まれています。この場合も、静的にネストされたクラスのすべてのアクセス権限が内部クラスに適用されます。ただし、外部クラスのインスタンスがすでに使用可能であるため、外部クラスのインスタンス変数とメソッドに自動的にアクセスできます。
内部クラスとアクセス指定子の優れた(そして非常に詳細な)議論については、内部クラス仕様を読むことができます。特に、ネストされたクラスがprivate
その外部クラスのメンバーにアクセスする方法について説明します。より穏やかに読むのは、ネストされたクラスのチュートリアルです。
トピック外:次のクラス構造があるとします。
public class O {
public O() { ... }
public class I { // an inner class
public I() { ... }
...
}
...
}
そして、あなたは次のインスタンスを作成しましたO
:
O outer = new O();
ここで、のインスタンスを作成するとしますO.I
。new O.I()
の新しいインスタンスをI
の特定のインスタンスで囲む必要があるため、単に使用することはできませんO
。このために、Javaは次の構文を提供します。
O.I inner = outer.new O.I();
次に、を参照するようinner
に2番目this
のフィールドが設定されますouter
。
この「修飾new
演算子」構文は、内部クラスにのみ使用されることに注意してください。ネストされたクラスの場合I
は不要です(実際にはエラーです)。static
1 「静的内部クラス」というフレーズに出くわすことがよくあります(恥ずかしいことに、この回答の以前のバージョンを含みます)。これは誤った用語です。Javaでは、「内部クラス」は具体的にはstatic
ネストされていないクラスです。