7

私は初心者で、現在継承とポリモーフィズムを読んでいます。「extend」というキーワードと、コンストラクターの呼び出し方法に関して、いくつかの混乱があります。コードは次のとおりです。

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

class A {
  int i = 7;

  public A() {
    System.out.println("i from A is " + i);
  }

  public void setI(int i) {
    this.i = 2 * i;
  }
}

class B extends A {
  public B() {
    setI(20);
    System.out.println("i from B is " + i);
  }

  public void setI(int i) {
    this.i = 3 * i;
  }
}

3 行目で B() を呼び出すと、クラス A のコンストラクターが呼び出され、次に B のコンストラクターが呼び出されて (そうですか?)、「A からの i は 7」、「B からの i は 60」と表示されます。しかし、誰かがこれの重要性を説明できますか? B の int i が A の i とまったく異なるのはなぜですか? 繰り返しますが、new B() 行の後のコードの「パス」をたどるのに問題があります。B() が呼び出された後の各ステップを誰かが説明できれば、それは大歓迎です。

4

5 に答える 5

1

Java言語仕様によると

コンストラクター本体が明示的なコンストラクター呼び出しで始まらず、宣言されているコンストラクターが基本クラス Object の一部でない場合、コンストラクター本体はスーパークラス コンストラクター呼び出し "super();"、つまりコンストラクターの呼び出しで暗黙的に開始されます。引数を取らない直接のスーパークラス。

これは、 を記述するときに、コンストラクタ for がnew B()最初に行うことは、コンストラクタ forBを呼び出すことを意味しますA。のコンストラクターが 7 にA設定された後、 のコンストラクターが を呼び出し、の値を 60に変更します。それは単にあるものと次のものの間で値を変更しただけです。iBsetI(20)iiABprintln

于 2013-09-11T22:07:07.983 に答える