5

私が読んでいる本のテキストは要約で述べています

「技術的には、コンストラクターは現在のクラスと同じ名前であるため、オーバーライドできません。継承される代わりに、新しいコンストラクターが作成されます。このシステムは正常に動作します;...」

私が理解できない部分は、彼らがこれを言うときです:

「クラスのコンストラクター メソッドが呼び出されると、すべてのスーパークラスに対して同じシグネチャを持つコンストラクター メソッドも呼び出されます。したがって、継承するクラスのすべての部分に対して初期化が発生する可能性があります」

私が理解していないのは、同じ署名セクションです....すべてのコンストラクターが同じ署名を持っている必要があるかのように私に出くわし、子クラスオブジェクトを初期化すると、代わりにすべてのスーパークラスが自動的に呼び出されますサブクラスごとに super(arg1,arg2) を呼び出す必要があります....これは彼らが述べていることですか?

4

3 に答える 3

10

それは正しくありません。スーパークラスのコンストラクターは、それがデフォルトのコンストラクター (つまり、引数のないコンストラクター) である場合にのみ自動的に呼び出されます。

スーパークラスにデフォルトのコンストラクターがない場合は、選択したコンストラクターを で明示的に呼び出す必要がありますsuper(args..)

たとえば、BearManPigのコンストラクターが とは異なる署名を持っているにもかかわらず、これはまったく問題ありませんAnimal

public class Animal {
  public Animal() {
  }
}

public class BearManPig extends Animal {
  public BearManPig(String string) {
  }
}

これは、Java がデフォルトの引数のないコンストラクターを検出したためです。

ここで、デフォルトのコンストラクターがない場合は、どのコンストラクターを呼び出すかを明示する必要があります。たとえば、これは機能しません

// DOESN'T COMPILE
public class Animal {
  public Animal(String string) {
  }

  public Animal(String string0, String string1) {
  }
}

public class BearManPig extends Animal {
   // There is no default constructor, stupid Java can't figure out what to do
  public BearManPig(String string) {
  }
}

しかし、これは:

// does compile
public class Animal {
  public Animal(String string) {
  }

  public Animal(String string0, String string1) {
  }
}

public class BearManPig extends Animal {
  public BearManPig(String string) {
    super(string); // I've told Java what to do
  }
}
于 2012-06-16T15:57:28.090 に答える
4

すべてのスーパー クラスが同じコンストラクター シグネチャを持つ必要はありません。
新しいオブジェクトを作成するときに、コンストラクターが定義されていない場合、Java はスーパー クラスのパラメーター コンストラクターを呼び出しません。他のコンストラクターを定義しない場合、Java によって提供されるパラメーター コンストラクターはありません。
他のコンストラクターを定義する場合は、子クラスのコンストラクター内で (最初の行で) 呼び出す必要があります。
これは役立つかもしれません。

于 2012-06-16T15:57:52.760 に答える
2

クラスのコンストラクター メソッドが呼び出されると、すべてのスーパークラスに対して同じシグネチャを持つコンストラクター メソッドも呼び出されます。したがって、継承するクラスのすべての部分に対して初期化が発生する可能性があります

これは正しくありません。まず、用語に関する注意: コンストラクターはメソッドではないため、「コンストラクター メソッド」という用語には意味がありません。

スーパー クラス コンストラクターが呼び出されることは事実ですが、同じシグネチャを持つ必要はありません。サブクラス コンストラクターが次のようなスーパークラス コンストラクター呼び出し式で始まる場合

class Student extends Person {
    public Student(String name) {
        super(name, Occupation.STUDENT);
    }
}

呼び出された引数の数と型に一致するスーパークラス コンストラクター。そのコンストラクターに渡す引数は完全に自由です。

サブクラス コンストラクターがスーパー コンストラクター呼び出し式で始まらない場合、コンパイラーはスーパークラスのアクセス可能なゼロ引数コンストラクターへの呼び出しを挿入します。そのようなコンストラクターがない場合は、コンパイル エラーを発生させます。

Sams は今のところ 21 日間で Java 2 を独学します

Java 2 が 10 年前のものであることをご存知ですか? これほど古い本はどれも時代遅れのことを教えてくれるので、すぐに忘れたほうがよいでしょう。もっと現代的な本を使ってみませんか?

于 2012-06-16T16:09:55.340 に答える