次の変数宣言に違いはありますか?
Class A {
private int a;
A(){
a= 2;
}
}
VS
Class A {
private int a = 2;
A(){
}
}
ガベージ コレクションの動作に違いはありますか?
次の変数宣言に違いはありますか?
Class A {
private int a;
A(){
a= 2;
}
}
VS
Class A {
private int a = 2;
A(){
}
}
ガベージ コレクションの動作に違いはありますか?
いいえ、Javaコンパイラはコンストラクタ内で「private int a = 2」を内部的に初期化するため、違いはありません。上記のステートメントを確認するには、Java 逆コンパイラを使用できます。したがって、両方のGCで同じように機能します。
2 つの初期化の動作に違いはありません。最初の例ではa = 2
、コンストラクター コードが呼び出される直前に発生します。a
最終的に作成した場合:
private final int a; //first example
private final int a = 2; //second example
次に、コンストラクターでできることの違いがわかります。
A(){ //The blank final field a may not have been initialized for first example
}
A(){
a = 2; //The final field Apple.a cannot be assigned for second example
}
どちらの場合もint a
、クラスのメンバー変数として宣言しています。クラスがインスタンス化されるたびに、その整数用にヒープにスペースが確保されます。ただし、ガベージ コレクターは、インスタンス化された包含オブジェクトへの参照があるかどうかのみを気にします。メンバー変数で何をするかに関係なく、オブジェクトへの参照がある場合、オブジェクトはメモリに残り、その後はガベージ コレクションの対象になります。
しかし、おそらく違いがあるべきだと思いますか?何故ですか?