4

以下の例を参照してください。

class A {
   A() { this(1); }
   A(int i) { System.out.println("A" );  }
}

class B extends A {
    B() {}
    B(int i) {  System.out.println("B" );  }
}

public class Test
{
    public static void main(String[] args)   {        
       A o =  new B();
    }
}

出力:

A

Q1:javaは「this(1)」の遅延バインディングを実行しないようです。コンパイル時に決定しました。ご確認ください。

Q2:Javaはコンストラクターで遅延バインディングを実行しません。確認してください。

Q3:これは、コンストラクターが暗黙的に最終的なものであることを意味しますか?

4

6 に答える 6

7

コンストラクターをオーバーライドすることはできません。継承規則にはまったく従いません。オブジェクトを構築するには単純な順序が必要なため、継承規則に従うことはできません。

たとえば、あなたの例では、A(int) コンストラクターをオーバーライドできる場合、A() は B(int) を呼び出しますが、B(int) は暗黙的に A() である super() を呼び出し、無限再帰があります。

コンストラクターがオーバーライド可能なメソッドを呼び出すことは、しばしば悪い習慣と見なされます。したがって、コンストラクターにこれを自動的に行わせることは、非常に悪い考えです。

コンストラクターがメソッドのように最終的なものである場合static final、それらを非表示にすることもできませんが、非表示にすることはできるので、いずれかであると言えfinalます。

于 2012-06-07T07:51:58.717 に答える
2

Java はコンストラクターをオーバーライドしません。

A o = new B(); B() を呼び出し、そこで super() を呼び出します。

A()が呼び出されますが、ここで呼び出しthis(1)ているということはA(1)、何も変わっていないことを意味します。コンストラクターについて話すと、すべてがコンパイル時に決定されます。

答え:

Q1:Seems java does not perform late binding for "this(1)". It has been decided at compile-time.Please confirm.

はい、コンパイル時にのみコンストラクターが決定されます。

Q2:Java does not perform late binding on any constructors. Please confirm.

オーバーライドしないため、遅延バインディングはありません。

Q3:Does this mean constructors are implicitly final?

いいえ、それらは最終的なものではありませんが、オーバーライドすることはできません。

編集: A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclassJava ドキュメントを参照

于 2012-06-07T08:00:45.303 に答える
1

Q1: 真

Q2: それはコンストラクタに関するものではなく、これに関するものです。これは常に、子クラスではなく、クラスまたはスーパー クラスに存在するメソッド/フィールドを参照します。親は子の実装を知らないので、それは理にかなっています

Q3: コンストラクターは特別なメソッドであり、チェーンされているためオーバーライドする意味がありません

于 2012-06-07T07:52:33.150 に答える
0

サブクラスのインスタンスを作成するときは、スーパークラスのコンストラクターを呼び出す必要があります。

コンストラクターを指定しない場合、デフォルト (引数なし) のコンストラクターが呼び出されます。

つまり、 の引数なしコンストラクタはB、実際には次のように実行されます。

B() {
    super();
}
于 2012-06-07T07:51:17.280 に答える
0

「「this()」はオーバーライドされていません」は何の意味もありませんし、他の質問も意味がありません。

ここで起こっているのは、 のコンストラクターBが両方とも暗黙的に を呼び出しsuper()ていることだけです。これは、他に何もコーディングしていないためでsuper()ありA()、 を呼び出すthis(1)です。

于 2012-06-08T01:07:58.997 に答える
0

サブクラス コンストラクターをインスタンス化すると、独自のタスクを実行する前に、まずそのスーパークラスの既定のコンストラクターが呼び出されます。これは暗黙的に、またはsuper()参照を介して行われます。

したがって、への呼び出しB()は、呼び出すコンストラクターA()を呼び出しますA(1)

同様にB(2)、出力を呼び出すと (デフォルトのコンストラクター A() を呼び出し、次に A(1) を呼び出します)

A
B
于 2012-06-07T08:05:15.587 に答える