JAva-コンストラクション関数実行初期化

2090 ワード

今日は不思議なコードを見て、まだ分からないので、先にバックアップします.
親:
      
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の底が実現するものです..今のレベルが足りない.のこれしか考えられない