JAva-コンストラクション関数実行初期化
2090 ワード
今日は不思議なコードを見て、まだ分からないので、先にバックアップします.
親:
サブクラス:
テストクラス:
結果:
不思議です...サブクラスのset付与メソッドは、親クラスのsetメソッドを呼び出し、独自の付与メソッドを実行します.親の値は変わりましたが、子の値は変わりません.やはり1.しかし、サブクラスの初期化を外し、public int mSubXに変更する.実行結果は正しい111です.
これはjvmの下層実現にかかわる...インターネットで検索した資料だけが自分の理解を形成しているのは、必ずしも正しいとは限らない.
まず、マルチステート呼び出しの順序は:1.親staticブロック->2.サブクラスstaticブロック->3.親メンバーのブロックの初期化と初期化->4.親の構築方法->5.サブクラスの一般メンバーのブロックの初期化と初期化->6.サブクラス構築方法.
今回出会ったこの問題のように,サブクラスのsi付与文は4,すなわち親クラス構築関数を呼び出すときに発生する.付与が完了するとsiの値は確かに111になったが,瞬時に5が実行され,siはまた1に付与され,111が上書きされた.
int siに相当する. si=1; 中間にsi=111が挿入された.こんな文..
int siのみの場合、なぜsiの値が0で上書きされていないのか.ネット上ではサイレント初期化(すなわち、値を与えない初期化)と呼ばれ、変数に値を与えて初期化すると、変数が初期化されていないかどうか、すなわち変数が2回も初期化されていないかどうかを判断します.int siに相当する.si=0;この2つの文の間にsi=111が挿入されているだけで、si=0は実行されません.の具体的にさらに深く掘るとjvmの底が実現するものです..今のレベルが足りない.のこれしか考えられない
親:
class SuperClass {
public int mSuperX = 1;
public SuperClass(){
setX(100);
}
public SuperClass(int x) {
setX(x);
}
public void setX(int x) {
System.out.println(" setX , :" + x);
mSuperX = x;
}
}
サブクラス:
class SubClass extends SuperClass {
public int mSubX = 1;
public SubClass() {}
public SubClass(int x) {
super(x);
}
@Override
public void setX(int x) {
super.setX(x);
mSubX = x;
System.out.println(" setX , :" + x);
}
public void printX() {
System.out.println("SubX = " + mSubX);
}
}
テストクラス:
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass sc = new SubClass(111);
System.out.println(sc.mSuperX);
System.out.println(sc.mSubX);
sc.printX();
}
結果:
setX , :111
setX , :111
111
1
SubX = 1
不思議です...サブクラスのset付与メソッドは、親クラスのsetメソッドを呼び出し、独自の付与メソッドを実行します.親の値は変わりましたが、子の値は変わりません.やはり1.しかし、サブクラスの初期化を外し、public int mSubXに変更する.実行結果は正しい111です.
これはjvmの下層実現にかかわる...インターネットで検索した資料だけが自分の理解を形成しているのは、必ずしも正しいとは限らない.
まず、マルチステート呼び出しの順序は:1.親staticブロック->2.サブクラスstaticブロック->3.親メンバーのブロックの初期化と初期化->4.親の構築方法->5.サブクラスの一般メンバーのブロックの初期化と初期化->6.サブクラス構築方法.
今回出会ったこの問題のように,サブクラスのsi付与文は4,すなわち親クラス構築関数を呼び出すときに発生する.付与が完了するとsiの値は確かに111になったが,瞬時に5が実行され,siはまた1に付与され,111が上書きされた.
int siに相当する. si=1; 中間にsi=111が挿入された.こんな文..
int siのみの場合、なぜsiの値が0で上書きされていないのか.ネット上ではサイレント初期化(すなわち、値を与えない初期化)と呼ばれ、変数に値を与えて初期化すると、変数が初期化されていないかどうか、すなわち変数が2回も初期化されていないかどうかを判断します.int siに相当する.si=0;この2つの文の間にsi=111が挿入されているだけで、si=0は実行されません.の具体的にさらに深く掘るとjvmの底が実現するものです..今のレベルが足りない.のこれしか考えられない