Java内のネストされたクラスに関連するいくつかの質問があります。
メモリ割り当てに関して、ネストされたクラスは「内部」でどのように表示されますか?
ネストされたクラス内で静的変数を宣言することはできません(正確なエラーは、静的属性は最上位クラスでのみ宣言できるということだったと思います)。なぜこれがあり、ネストされたクラスには他にどのような制限がありますか?
可能であれば、あなたの答えがJava固有であるかどうか、またはC++も同じルールに従っているのかどうかを教えてください。
Java内のネストされたクラスに関連するいくつかの質問があります。
メモリ割り当てに関して、ネストされたクラスは「内部」でどのように表示されますか?
ネストされたクラス内で静的変数を宣言することはできません(正確なエラーは、静的属性は最上位クラスでのみ宣言できるということだったと思います)。なぜこれがあり、ネストされたクラスには他にどのような制限がありますか?
可能であれば、あなたの答えがJava固有であるかどうか、またはC++も同じルールに従っているのかどうかを教えてください。
内部クラスは、メモリとコンパイルに関する限り、通常のクラスとまったく同じです。(メモリ内での管理方法に多少の違いがあるかもしれませんが、平均的なJava開発者には見えません)実際、内部クラスを持つクラスをコンパイルすると、コンパイルされた.classファイルはとして表示されOuterClass$InnerClass.class
ます。私の知る限り、JVMはそれらを同じように扱います。
静的変数に関する限り、問題が何であるかはわかりません。たとえば、これは私のために実行されます:
public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}
public class InnerTester {
public static final String MY_STRING = "MY_STRING";
}
}
編集
Jefferyが指摘したように、これはコンパイルされません。
public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}
public class InnerTester {
public static String MY_STRING = "MY_STRING";
}
}
違いは、最初の静的変数がfinalとしてリストされていることです。
これについてしばらく考えた後、私は@Eugeneに同意します。final
初期化に問題がないため、内部クラスの静的フィールドを使用できます。値を変更することはできません。値に初期化するだけです。ただし、静的フィールドがでない場合は、フィールドを初期化するために外部クラスの インスタンスfinal
を作成する必要があり、静的メンバーを特定のインスタンスに関連付けることはできません。
私もその上でこの議論を見つけました。
基本的に、ネストされたクラスは、囲んでいるインスタンスを参照するフィールドを持つ単なるクラスです。
静的にネストされたクラス(静的フィールド/メソッドを宣言できるクラス)でない限り。この場合、名前に別のパス要素が含まれるクラスです(パッケージ+クラス名を囲む)。
言い換えると。非静的ネストクラス(内部クラス)-インスタンス(本の中のページなど)を囲まずに存在することはできません。そして、次のようにインスタンス化します。
Book book = ... // a book instance;
Book.Page page = book.new Page(); // requires an enclosing instance
しかし、静的にネストされたクラスは完全に独立しており、名前空間の問題のようなものです。次のようにインスタンス化できます。
Outer.NestedStatic instance = new Outer.NestedStatic(); // just name-space
詳細はこちら:http ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
ネストされたクラスは、単に別のクラス内の型の定義です。Javaは、新しい型がどのスコープで定義されているかを気にせず、特別な方法でこの内部クラスを「処理」する必要はありません。
非静的内部クラスへの参照は必然的にインスタンス変数であるため、静的フィールドを持つ非静的内部クラスを持つことは意味がありません。内部クラスが作成された場合にのみ、static
静的に割り当てることも可能になります。この場合、静的内部クラスはスタンドアロンクラスであり、囲んでいるクラス名がさらに別の名前空間レベルとして機能します。