Java の継承では、サブクラスは親クラスのコンストラクターを継承しませんが、(暗黙的または明示的に) call する必要があります
次の例を見てください:
public class TestExtends { public static void main(String[] args) { SonClass s = new SonClass(66); } } class FooClass{ public FooClass() { System.out.println(100); } public FooClass(int count) { System.out.println(count); } } class SonClass extends FooClass{ public SonClass() { } public SonClass(int c) { System.out.println(1234); } }
実行結果:
100
1234
次に、なぜそのような結果が生成されるのかを分析してください:
プログラムは行 SonClass s = new SonClass(66); を実行しています。
SonClass s = new SonClass(66);
这行时,调用
public SonClass(int c) { System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
因此子类在执行上面的构造方法时,等价于执行了下面的代码:
public SonClass(int c) { super(); // 必须在第一行调用,否则不能编译 System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
所以结果为:100 1234
接下来介绍另外一种情况(显式调用),如果子类构造函数是这样写的:
public SonClass(int c) { super(2); // 必须写在第一行,否则不能编译,显式调用父类构造函数后,系统就不在默认调用无参构造函数了 System.out.println(1234); }
执行结构是:2 1234
実行構造は:rrreee
构造函数是不能继承的,只是用来在子类调用,(如果父类没有无参构造函数,创建子类时,必须在子类构造函数代码体的第一行显式调用父类的有参数构造函数,否则不能编译);
- rrreee
如果父类没有有参构造函数,那么在创建子类时可以不显式调用父类构造函数,系统会默认调用父类的无参构造函数
を呼び出すとき、したがって、サブクラスが上記のコンストラクター メソッドを実行すると、次のコードを実行するのと同じになります:super()
rrreee- したがって、結果は次のようになります:
Nextこの場合 (明示的な呼び出し)、サブクラス コンストラクターが次のように記述されている場合:
100 1234
2 1234
概要:
コンストラクターは継承できず、サブクラスを呼び出すためにのみ使用されます (親クラスにパラメーターのないコンストラクターがない場合は、サブクラスを作成するときにそれが存在する必要があります)サブクラス コンストラクターのコード本体 親クラスの最初の行は、親クラスのパラメーター化されたコンストラクターを明示的に呼び出します。そうしないとコンパイルできません)
親クラスにパラメーター化されたコンストラクターがない場合は、次のようにする必要はありません。サブクラスを作成するときに、親クラスのコンストラクターを明示的に呼び出します。システムは、親クラスのパラメーターのないコンストラクター super()
がデフォルトで呼び出されます。
以上がJava の継承、サブクラスが親クラスのコンストラクターを継承するかどうかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。