0

次のコードでは:

import java.io.*;

public class MyClass1
{
     MyClass1()
     {
         System.out.println("base class");
     }
     public void print()
     {
        System.out.println("base print");
     }
}

class ChildClass extends MyClass1
{
    public ChildClass()
    {
       System.out.println("child class");
    }
    public void print()
    {

      System.out.println("child print");
    }
}

タイプ ChildClass のインスタンスを作成すると、基本クラスのコンストラクターも実行されるのはなぜですか??

4

3 に答える 3

2

それが起こるはずだからです:-)

派生クラスは基本クラスを基礎として使用します。オブジェクト指向で言えば、それ基本クラスです。その基本クラスもそれ自体を初期化する必要があるため、そのコンストラクターを呼び出す必要があります。

あなたの例からは明らかではありませんが、基本クラスにいくつかの(保護された)メンバーを与えると、より理にかなっています。基本コンストラクターでそれらを初期化すると、構築時に派生クラスから見たときに期待値が得られます。

下記参照。フィールドvalueは子クラスで表示されます。初期化された値として何を期待しますか?

public class MyClass1
{
     protected int value;
     MyClass1()
     {
         System.out.println("base class");
         this.value = 42;
     }
}

class ChildClass extends MyClass1
{
    public ChildClass()
    {
       // what would you expect 'value' to be here ?
       System.out.println("child class " + value);
    }
}
于 2009-11-04T10:22:58.147 に答える
0

指定されていない場合、コンパイラはデフォルトで子クラスのコンストラクターに super() コンストラクターを追加するためです。すべてのコンストラクターは、継承がない場合は this() メソッド、継承がある場合は super() メソッドのいずれかを持つ必要があります。それを説明するために、この例を取り上げました。

  public class Vehicle {
    protected int wheels;
    protected int lights;

    Vehicle(){
        System.out.println("Vehicle Class Constructor");
        this.wheels=4;
        this.lights=2;
    }
 }

車両は親クラスです

 class Car extends Vehicle {
  public Car(){
    #Compiler add the super() constructor by default
        System.out.println("Car class constructor");
    }
}

車はChildクラスです

public class TestCar {
   public static void main(String args[]){
       Car c = new Car();
       System.out.println("Wheels" + c.wheels);
       System.out.println("Lights" + c.lights);
   }
}

上記のコード スニペットでは、コンパイル時に TestCar.java ファイルをコンパイルすると、コンパイラは Car コンストラクターを探し、 Car クラスが親クラス Vehicle を拡張することを確認するとすぐに、 Car クラスに親があるかどうかを確認します。継承ツリーに super() を提供。そうでない場合は、1 つ追加します。

お役に立てれば !

于 2009-11-04T11:50:41.470 に答える