abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
メインでクラス C をインスタンス化すると、B (親クラス) のコンストラクターが自動的に呼び出されます。それは正常ですか、それとも何か間違ったことをしていますか?
abstract class A {
abstract void method();
}
class B extends A {
B() {
}
void method() {
}
}
class C extends B {
C() {
}
}
メインでクラス C をインスタンス化すると、B (親クラス) のコンストラクターが自動的に呼び出されます。それは正常ですか、それとも何か間違ったことをしていますか?
何も問題はありませんsuper
。コンストラクターへの暗黙の呼び出しがあります。
クラスのコンストラクターを作成していないC
ため、デフォルトのコンストラクターはコンパイラーによって提供されます。
C(){
super();
}
デフォルトのコンストラクターが提供されている場合は、 への呼び出しがありますsuper()
。あなたの場合、C extends B
のコンストラクターB
が呼び出されます。
他のクラスでクラスを作成しない場合も、デフォルトでObject
クラスを拡張します。したがって、Object
クラス コンストラクターが呼び出されます。
コンストラクター本体が明示的なコンストラクター呼び出しで始まらず、宣言されているコンストラクターが基本クラス Object の一部でない場合、コンストラクター本体はスーパークラス コンストラクター呼び出し "super();" で暗黙的に開始されます。、引数を取らない直接のスーパークラスのコンストラクターの呼び出し。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7
C をインスタンス化すると、C、B、A、およびオブジェクトのコンストラクター呼び出しが行われます。AC は、直接的または間接的なスーパークラスとして動作できる必要があり、それらすべてのフィールドがあります。クラス X コンストラクターの仕事は、初期化されるオブジェクトを X として機能できるようにすることです。
宣言されたコンストラクターがない場合、コンパイラーはパラメーターなしのコンストラクターを作成するため、すべてのクラスに少なくとも 1 つのコンストラクターがあります。Object コンストラクターではないコンストラクターが "this" または "super" コンストラクター呼び出しで始まらない場合、コンパイラーはそれを "super();" (直接のスーパークラスのパラメーターなしのコンストラクターへの呼び出し) で始まるものとして扱います。
Javaの各コンストラクターの最初の行はコンストラクターを呼び出しますsuper
。これがJavaの仕組みです。あなたはそれについて読むべきです。