重複の可能性:
Java内部クラスと静的ネストクラス
Javaでの内部クラスの用途は何ですか?ネストされたクラスと内部クラスは同じですか?
違いは他の答えによってうまく対処されます。それらの使用法/関連性に関して、ここに私の見解があります:
これらは、新しい名前付きクラスを作成する負担なしに、コールバックを簡単に実装するのに便利です。
button.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
frame.dispose();
}
}
);
Runnable
また、スレッド化(匿名など)や他のいくつかの同様のパターンにも便利です。
OuterClass.StaticNestedClass
静的にネストされたクラスは、名前がであり、修飾子で遊ぶことができることを除いて、基本的に通常のクラスに似ています。そのため、トップレベルのクラスでは正確に実現できない何らかの形式のカプセル化が提供されました。
たとえば、クラス(内部でのみ使用される)をパッケージビューに表示しないようにしLinkedList
たい場合を考えてみてください。Node
静的にネストされたクラスにして、完全に内部にあるようにしLinkedList
ます。
内部クラスのインスタンスは、それを囲むクラスインスタンスのフィールドにアクセスできます。リンクリストをもう一度考えNode
て、内部クラスであると想像してください。
public class LinkedList {
private Node root = null;
public class Node {
private Object obj;
private Node next;
...
public void setAsRoot() {
root = this;
}
}
public Node getRoot() {
return root;
}
public void setRoot( Node node ) {
root = node;
}
}
Node
に属する各インスタンスは、LinkedList
直接アクセスできます。リストとそのノードの間には暗黙の所有権関係があります。リストはそのノードを所有します。同じ所有権関係では、通常のクラスで実装する場合、追加のコードが必要になります。
内部クラスと匿名クラスを使用してより優れたJavaコードを実現するを参照してください。
いいえ、それらは同じではありません。内部クラスは非static
です。
JLS8.1.3内部クラスとそれを囲むインスタンス
内部クラスは、明示的または暗黙的に静的と宣言されていないネストされたクラスです。
JoeDarcyの次の図も参照してください。
ジョセフ・D・ダーシーのOracleウェブログ-ネストされたクラス、内部クラス、メンバークラス、およびトップレベルクラス