2

私の理解によると、デフォルトコンストラクターはオブジェクトの状態をデフォルト値に初期化するため、このような明示的な引数なしのパブリックコンストラクターを提供すると、d と e の値はどのようにゼロに初期化されるのでしょうか。コンストラクターは呼び出されません。

public class B extends A{

    private int d;
    private int e;

    public B() {
        System.out.println(d);
        System.out.println(e);
    }
}

編集::デフォルトのコンストラクターが行う唯一のことはsuper()、ここで明示的に言及されたコンストラクターがあり、A がそのコンストラクターで 17 に初期化される保護された変数 c を持っている場合にどうなるかです。super()独自のコンストラクターを使用しているため、その変更を確認できるように明示的に呼び出すべきではありませんか? B がまだ継承によって 17 の値を取得しているのはなぜですか?

4

3 に答える 3

7

宣言、初期化ブロック、またはコンストラクターで明示的に初期化しない場合、すべてのクラス フィールドに既定値が割り当てられます。オブジェクトは null に、int は 0 に、booleans は false に、double は 0.0 に、float は 0.0f に、long は 0L に、char は '\u0000` に初期化されます...

JLS のセクション 4.12.5を参照してください。変数の初期値ですべて説明されています。

これらの規則は、ブロックまたはメソッドに対してローカルな変数には適用されませんが、ローカル変数は使用前にコーダーによって明示的に初期化する必要があることに注意してください。

編集編集
について:

デフォルトのコンストラクターが行う唯一のことは、super() の呼び出しです。ここで明示的に言及されたコンストラクターがあり、A に、コンストラクターで 17 に初期化される c などの保護された変数がある場合はどうなりますか。独自のコンストラクターを使用しているため、その変更を確認できるように明示的に super() を呼び出すべきではありませんか? B がまだ継承によって 17 の値を取得しているのはなぜですか?

回答:super()デフォルト コンストラクター、明示的に呼び出したかどうかに関係なく、B のコンストラクターの最初で呼び出されています。ここでスーパー コンストラクターを明示的に呼び出すことによって得られる唯一の追加の利点は、A の既定以外のコンストラクターが存在する場合、必要に応じて呼び出すことができることです。

于 2012-08-29T03:14:10.047 に答える
1

プリミティブ型のデータ メンバーを使用したため、言語仕様に従って値がデフォルト設定されます。この場合は、選択した値が使用されます。

コンストラクターを使用して、仕様に従ってデフォルトにしたくないクラスのすべてのメンバーを初期化できます (オブジェクトがnullデフォルトで値を取得するように)。

于 2012-08-29T03:36:45.457 に答える
0

その単純な変数は、初期化していないため、デフォルト値を取得します。整数のデフォルト値は 0 です

于 2012-08-29T07:23:49.203 に答える