デフォルトをJVM
呼び出してインスタンスを作成します。Constructor
Anonymous Class
私の理解はそれに対して愚かかもしれません。Reflection API
インスタンスの作成に使用したとしても、少なくともはあると思いますDefault Constructor
。Anonymous Class
持っていDefault Constructor
ますか?それ以外の場合、どのように、JVM
または何でもインスタンスを作成しますか?
デフォルトをJVM
呼び出してインスタンスを作成します。Constructor
Anonymous Class
私の理解はそれに対して愚かかもしれません。Reflection API
インスタンスの作成に使用したとしても、少なくともはあると思いますDefault Constructor
。Anonymous Class
持っていDefault Constructor
ますか?それ以外の場合、どのように、JVM
または何でもインスタンスを作成しますか?
はい、そうです。パラメータを指定することで、他のコンストラクタを使用することもできます。
与えられた
public abstract class A {
String str;
public A(String str){
this.str=str;
}
public abstract void doSomething();
}
できるよ
...
A a = new A("Hello World") {
public void doSomething() {
System.out.println(str);
}
};
a.doSomething();
クラスに明示的なコンストラクターがない場合、暗黙のデフォルトの空のコンストラクターがあります。これは、他のコンストラクターが呼び出されるのと同じように呼び出されます。
通常のクラスとは異なり、匿名クラスは暗黙のコンストラクターに関連付けられた異なる動作をしているように見えます。
通常のクラスを定義すると、コンパイラーは引数なしのコンストラクターのみを暗黙的に挿入できます。しかし、匿名クラスを使用すると、スーパークラスが持つすべてのコンストラクターを(コンパイラーによって暗黙的に)取得できます。
クラスがあるとしましょう:
class A {
A(int i) {}
A(String s) {}
}
次のようにサブクラス化すると...
class B extends A {}
...コンパイラがこれを実行しようとするため、コンパイルエラーが発生します。
class B extends A {
B() {
super(); // Error: there's no no-arg superclass constructor!
}
}
ただし、匿名クラスを作成すると、スーパークラス(A)に定義されているコンストラクターが暗黙的に作成されます。
A a1 = new A(1) {}; // OK. Uses (int) constructor
A a2 = new A("") {}; // OK. Uses (String) constructor
A a3 = new A() {}; // Error. There's no no-arg constructor
匿名クラスにこれらのコンストラクターがあるかのように
X(int i) {
super(i);
}
X(String s) {
super(s);
}
匿名クラスには、JVMによって1回呼び出されるデフォルトの引数なしコンストラクターがあります。匿名クラスには名前がないため、匿名クラスのコンストラクターを定義することはできません。クラスにコンストラクターが必要な場合は、代わりにローカルクラスを使用する必要があります。
いずれの場合も、新しく作成されたオブジェクトを初期化するためにコンストラクターが呼び出されます。匿名クラスにはデフォルトのコンストラクターがあり、クラスのフィールドがある場合はそれを初期化し、スーパークラスのコンストラクターを呼び出します。