スーパークラスからサブクラスにコンストラクタを継承する方法は?
コンストラクターは継承されません。スーパークラスの一致するコンストラクターにマップするサブクラスに、まったく同じプロトタイプの新しいコンストラクターを作成する必要があります。
これがどのように機能するかの例を次に示します。
class Foo {
Foo(String str) { }
}
class Bar extends Foo {
Bar(String str) {
// Here I am explicitly calling the superclass
// constructor - since constructors are not inherited
// you must chain them like this.
super(str);
}
}
スーパークラスコンストラクターを拡張クラスに継承することはできません。ただし、最初のステートメントとしてsuper()を使用して、拡張クラスコンストラクターで呼び出すことができます。
デフォルトのコンストラクター-(引数の宣言または暗黙の)out引数を持つパブリックコンストラクターは、デフォルトで継承されます。この例については、次のコードを試すことができます。
public class CtorTest {
public static void main(String[] args) {
final Sub sub = new Sub();
System.err.println("Finished.");
}
private static class Base {
public Base() {
System.err.println("In Base ctor");
}
}
private static class Sub extends Base {
public Sub() {
System.err.println("In Sub ctor");
}
}
}
スーパークラスからコンストラクタを明示的に呼び出す場合は、次のようにする必要があります。
public class Ctor2Test {
public static void main(String[] args) {
final Sub sub = new Sub();
System.err.println("Finished.");
}
private static class Base {
public Base() {
System.err.println("In Base ctor");
}
public Base(final String toPrint) {
System.err.println("In Base ctor. To Print: " + toPrint);
}
}
private static class Sub extends Base {
public Sub() {
super("Hello World!");
System.err.println("In Sub ctor");
}
}
}
唯一の注意点は、コンストラクターの最初の行にsuper()呼び出しが必要であるということです。そうしないと、コンパイラーはあなたを怒らせます。
super keyword (サブクラスコンストラクターを下にスクロール)について読んでください。あなたの質問を理解したら、おそらくスーパークラスのコンストラクターを呼び出したいですか?
スーパークラスコンストラクターを明示的に呼び出さない場合、Javaコンパイラーは引数なしのコンストラクターコールをスーパークラスに自動的に配置することに注意してください。
クラスコンストラクターではなく、クラス属性を継承します。
スーパークラスにコンストラクターが追加されていない場合は、コンパイラーは引数なしのコンストラクターを追加します。このデフォルトのコンストラクタは、サブクラスの新しいインスタンスが作成されるたびに暗黙的に呼び出されます。ここで、サブクラスにはコンストラクタがある場合とない場合がありますが、すべてOKです。
コンストラクターがスーパークラスで提供されている場合、コンパイラーは引数なしのコンストラクターかパラメーター付きのコンストラクターかを確認します。
引数がない場合、コンパイラはサブクラスのインスタンス化のためにそれを呼び出します。ここでも、サブクラスにコンストラクタがある場合とない場合がありますが、すべてOKです。
親クラスの1つ以上のコンストラクターにパラメーターがあり、argsコンストラクターがない場合、サブクラスには、親クラス構成体の暗黙的な呼び出しがsuper(parent_contractor params)を介して行われるコンストラクターが少なくとも1つ必要です。
これにより、継承されたクラス属性が常にインスタンス化されることが確実になります。
もしあれば
/**
*
*/
public KKSSocket(final KKSApp app, final String name) {
this.app = app;
this.name = name;
...
}
kKSSocketを拡張するKKSUDPSocketという名前のサブクラスには次のものがあります。
/**
* @param app
* @param path
* @param remoteAddr
*/
public KKSUDPSocket(KKSApp app, String path, KKSAddress remoteAddr) {
super(app, path, remoteAddr);
}
そして
/**
* @param app
* @param path
*/
public KKSUDPSocket(KKSApp app, String path) {
super(app, path);
}
スーパークラスへのメソッド呼び出しのように、引数をコンストラクタチェーンに渡すだけですが、スーパークラスコンストラクタを参照し、指定された引数を渡すsuper(...)を使用します。