4

派生クラスコンストラクター内でスーパークラスコンストラクターが呼び出されたときに、id = 0の値が表示されるのはなぜですか?子オブジェクトが作成されるとき、オブジェクトのヒープにメモリが割り当てられるのはいつですか?基本クラスコンストラクターの実行後または実行前?

class Parent{
        int id = 10;
        Parent(){
            meth();
        }
        void meth(){
            System.out.println("Parent :"+ id);
        }
    }
    class Child extends Parent{
        int id = 5;
        Child(){
            meth();
        }
        void meth(){
            System.out.println("Child :"+ id);
        }
    }
    public class OverRidingEg {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Child a= new Child();

        }

    }
4

1 に答える 1

5

スーパークラスコンストラクターが最初に実行されます。したがって、オーバーライドされたメソッドが呼び出されたとき、子コンストラクターはまだ実行されていないためid、サブクラスのフィールドには引き続きデフォルト値があります。

そのため、コンストラクターからオーバーライド可能なメソッドを呼び出すことは、PMDなどのツールによってフラグが立てられ、悪い習慣です。そのようなメソッドが呼び出されたときに、オブジェクトの不変条件は満たされません。

于 2013-03-21T15:57:46.623 に答える