0

次のコードの制御の流れを理解できません。

class Television {
    private int channel=setChannel(7);

    public Television (int channel) {
        this.channel=channel;
        System.out.println(channel + "");
    }

    public int setChannel(int channel) {
        this.channel=channel;
        System.out.print(channel + " ");
        return channel;
    }
}

public class TelevisionMain {
    public static void main(String[] args) {
        Television t = new Television(12);
    }
}

出力は 7 12 です。

これは、明示的な呼び出しが最初に発生することを意味します。私はJavaが初めてで、実行はメインから開始されると思っていたので、コンストラクターを最初に呼び出す必要がありました。なぜこれが起こるのか誰でも説明できますか?

4

4 に答える 4

2

初期化は構築の一部であり、super() が呼び出された後、コンストラクターの本体の前に発生するように定義されています。

コンストラクターが最初に呼び出されている必要があります。

です。フィールドの初期化はコンストラクターの一部です。

于 2013-11-01T20:09:02.177 に答える
0

最終的に答えは、仕様がそうすべきだと言っているからです。ただし、逆の方法で動作すると、デフォルトの初期値を上書きできなくなるため、この方法にすることは合理的です。

順序が最初にコンストラクタであり、次に他のすべてである場合、順序は次のようになります

  • と呼ばれるテレビ(12)
  • コンストラクター内でチャネルを 12 に設定
  • int channel =setChannel(7); によってチャネルを 7 に戻します。

これらのデフォルト値はコンストラクターによって変更できなかったため、デフォルト値を使用できなかったため、これは明らかに不合理な状況です。

于 2013-11-01T20:09:56.853 に答える