0

クラスのオブジェクトを作成するときに、コンストラクターがそのオブジェクトを構築することを知っています。これらの2つのクラスがあるとします:

class Vehicle {
    public int a = func();

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}

class Car extends Vehicle  {

    public static void main(String[] args) {
        Car c = new Car();
    }
} 

このプロジェクトの出力は「9」です。しかし、なぜそれが起こるのですか?Car コンストラクターが呼び出されると、正確には何が起こりますか? ある種のデフォルトコンストラクターがあることは知っていますが、それがどのように機能するのか正確にはわかりません。

上記の例でオブジェクトの構造を説明してくれる人はいますか?

4

5 に答える 5

9

コンパイラは、実質的に次のデフォルト コンストラクタを提供します。Car

Car() {
    super();
}

同様Vehicleに、次のデフォルトのコンストラクターとして:

Vehicle() {
    super();
}

フィールドは、スーパークラス コンストラクターの呼び出し後に、初期化の一部として初期化されます。つまり、クラスが実際に次のように記述されているかのようですVehicle

class Vehicle {
    public int a;

    Vehicle() {
        super();
        a = func();
    }

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}

今、それは理にかなっていますか?

より詳細な説明については、Java 言語仕様のセクション 15.9.4 を参照してください。

于 2013-02-22T09:35:27.603 に答える
2

が呼び出されると、そのCar constructorスーパー コンストラクターへのデフォルトの呼び出しがコンパイラーによって行われ、すべてのSuper class's instance fields. sysoutを持つメソッドをa field呼び出すため、初期化中に9が出力されます。func()

public Car() {
super();// this invokes parent class's default cons
}

public Vehical() {
super();// invokes Object constructor then initializes all the instance variables of class vehical
}
于 2013-02-22T09:35:00.617 に答える
1

の意味を誤解していると思いますCar c = new Car();

そのステートメントはオブジェクト参照を作成し、そのオブジェクトの参照はcです。このステートメントnew Car();はオブジェクトを作成し、そのオブジェクトの参照が に格納されて送信されcます。

于 2013-02-22T09:43:23.183 に答える
1
  1. JVM には、 をCar構築する必要があることが通知されます。
  2. JVM はそれが であると判断し、したがって構築Vehicleをトリガーします。Vehicle
  3. JVM は、a の構築にはインスタンス変数Vehicleの初期化が必要であることを認識しています。int a
  4. int a変数は、呼び出しの結果になるように初期化する必要がありfuncますfunc
  5. funcが呼び出されたため、コードは"9"を出力します。
于 2013-02-22T09:39:25.233 に答える
0

オブジェクトが作成されると、そのオブジェクトに存在するすべてのインスタンス変数が開始されます (代入が指定されていない場合は、その変数のデフォルト値になります)。

特定のクラス ( Car ) のデフォルト コンストラクターが呼び出されると、そのスーパー クラス ( Vehicle ) のデフォルト コンストラクターが最初に呼び出されます。Vehicle オブジェクトの作成中に、そのインスタント変数「a」が関数 func() に割り当てられ、実行されます。したがって、9 が出力されます。

于 2013-02-22T10:14:21.923 に答える