私はこれの内部を見ていませんが、最初に、コンパイラがコンパイル時に新しいオブジェクトを追加すると仮定しましょう。これは、すべてのクラスが別のクラスの内部クラスであることを意味します。それらは別のクラス内で宣言されていないため、これは当てはまりません。だから:いいえ、コンパイル時にこのようなものを追加しません。
実際に、これを分解してみましょう。
public class Outer {
String strHello = "Hello ^^";
public void printHello() {
System.out.println(strHello);
}
public static void main(String[] args) {
// This will print: Hello ^^
Outer outer = new Outer();
outer.printHello();
// This will print: Hello ^^
new Outer().printHello();
}
}
このようなコードを以前に見たことがあると思います。インスタンス化されたクラスのメソッドを呼び出すだけです。ドット表記を使用して、変数や内部クラスにアクセスすることもできます。上記では、インスタンスメソッドに使用しました。キーワードをstatic
使用すると、クラスのすべてのインスタンスまたは個別のクラスでメソッドと変数を共有できます。
public class Outer {
static String strHello = "Hello ^^";
public static void printHello() {
System.out.println(strHello);
}
static class StaticInner {
}
static class Inner {
}
public static void main(String[] args) {
// Prints: Hello ^^
Outer.printHello();
// Constructs a new Example.StaticInner
Outer.StaticInner inner = new Outer.StaticInner();
// Constructs a new Outer.Inner
Outer.Inner inner = new Example().new Inner();
// Constructs a new Outer.Inner
Example ex = new Example();
Outer.Inner inner = ex.new Inner();
}
}
上記のコードは、静的な内部クラスを使用して、内部コンストラクターが他のコンストラクターとまったく同じであることを示しています。ただし、別のクラス内にあるため、別の (外部) クラスを介してアクセスする必要があります。静的な内部クラスではない場合、アクセス修飾子のためにインスタンスを使用してアクセスする必要があります。