ジュニアJava開発者のためのタスクとして与えられるコードがあります。私は5年間のJavaを使用すると、コードのこの部分は完全に私を混乱:Java:オブジェクトの初期化シーケンス
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
出力は次のようになります。
Hello World!
variable value = null
しかし、我々はString variable;
にString variable = null;
を変更した場合、我々は持っています:
Hello World!
variable value = variable is initialized in B Class
2番目の出力は私にとってより明確です。
- 私たちは、このルートの親クラスに来たときに私たちは、(Javaのためにそれがクラスオブジェクトは常にある)クラス階層のルートに行く:だから、私の知る限り、このようにJavaでinizialisationのシーケンスを知っているよう :
- すべての静的データフィールドが初期化されます。
- すべての静的フィールド初期化子と静的初期化ブロックが実行されます。
- すべての非静的データフィールドが初期化されます。
- すべての非静的フィールド初期化子と非静的初期化ブロックが実行されます。
- デフォルトコンストラクタが実行されます。
- 次に、基本となる子クラスの手順を繰り返します。
- :上記のルールに基づいて
Calling base class overridden function from base class methodが、私はこのような配列を有することを前提と -
- :上記のルールに基づいて
はまた、スーパークラスのコンテキストでthis
キーワードの動作を説明する投稿がありクラスB
の新しいインスタンスを作成します。
Main
に行きます。main.variable
をnullで初期化します。Main
のデフォルトのコンストラクタに移動します。Main
のメソッドを呼び出します。 (?なぜそれが私たちはここthis
キーワードを持っていないmain.printvariable
を呼び出すことはありません。)b.variable
B
に戻ってくる「変数ははBクラスに初期化されます」。b.variable
をヌル値で初期化する必要がありますか?B
のデフォルトコンストラクタがをしてください実行し、誰かがこの継承inizialisationシーケンスがどのように動作するかの完全かつ完全な説明を与えることができます。そしてString variable = null;
をString variable;
に変更すると別の出力につながるのはなぜですか?
printVariable(でき)はかなり誤解を招くようなメソッド名である - (よりはSetVariableようにする必要があります) – Jimmt
あなたは5年間Javaを書いてきましたが、あなたはデバッガの使い方を知らないのですか? (コードをステップ実行すると、何が起こっているのか、どのような順序であるのかが正確に表示されます)。 –
@BrianRoach私はデバッガを使うことができますし、javap -v -c B.classも試しました。しかし、Java開発者やインタビューの質問にこのようなタスクが表示されるたびに、出力を予測して理解し、なぜこのように動作し、コードをわずかに修正すればどうなるでしょう。ステッピングスルーはルールと実行プロセスの理由を説明しません。 – INlHELL