私の教科書によると:
サブクラス内のコンストラクターの実行によってスーパークラス コンストラクターが呼び出されない場合、Java はスーパークラスのパラメーターなしのコンストラクターを自動的に呼び出します。
それは、すべてのスーパークラス データ フィールド (スーパークラス変数) が null に設定されることを意味しますか (コンストラクターがパラメーターのないコンストラクターであるため)。
私の教科書によると:
サブクラス内のコンストラクターの実行によってスーパークラス コンストラクターが呼び出されない場合、Java はスーパークラスのパラメーターなしのコンストラクターを自動的に呼び出します。
それは、すべてのスーパークラス データ フィールド (スーパークラス変数) が null に設定されることを意味しますか (コンストラクターがパラメーターのないコンストラクターであるため)。
その人が不注意でそれらを指定しない場合、エラーが発生しますか?
あなたは「彼ら」が何を指しているのか言っていませんが...
クラスコンストラクターが、そのスーパークラスが(明示的または暗黙的に)提供しない引数のないコンストラクターに(明示的または暗黙的に)依存している場合、それはコンパイルエラーです。
プログラマーが誤ってクラス内のコンストラクターを省略し、その参照フィールドが(のみ)デフォルトで初期化さnull
れた場合、コンパイルエラーは発生しません。(コードは有効です。コンパイラーはプログラマーの意図を判断できません。つまり、コンストラクターが誤ってまたは故意に省略されたかどうかを判断できません。)ただし、一部のコードがフィールド/フィールド値を非であると想定して使用すると、後でランタイムエラーが発生する可能性があります。 -ヌル。
プログラマーがコンストラクターを定義したが、コンストラクターが一部のフィールドの初期化に失敗した場合、結果は2と同じになります。コンパイルエラーはなく、実行時エラーの可能性があります。
いいえ、super
引数のない s コンストラクターがいくつかのオブジェクトを初期化する場合、この初期化が行われます。
class A {
public int x;
A () {
x = 1;
}
}
class B extends A {
B() {
}
}
のB
コンストラクターはsuper()
(明示的に記述されていなくても) 最初の行として呼び出され、x=1
その過程で初期化されます。
これは、スーパークラスのフィールドが、非パラメーター コンストラクターによって設定されたものに設定されることを意味します。
これは、そうでない場合もありますnull
。非パラメーター スーパークラス コンストラクターが定義されておらず、サブクラスのコンストラクターがスーパークラス フィールドを設定していない場合、それらは .yes になりますnull
。
いいえ:
class A {
public int x;
public A() {
x = 42;
}
}
class B extends A {}
assert(new B().x == 42)
「パラメーターなしのコンストラクター」は、空のコンストラクターである必要はありません。