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 回答