子类构造函数(JAVA)中的重写函数

时间:2013-03-21 15:52:39

标签: java inheritance constructor override

在派生类构造函数中调用超类构造函数时,为什么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();

        }

    }

1 个答案:

答案 0 :(得分:5)

首先执行超类构造函数。因此,当调用重写方法时,子构造函数尚未执行,因此子类中的id字段仍具有其默认值。

这就是为什么从构造函数中调用可覆盖的方法是一种不好的做法,由PMD等工具标记:当调用这样的方法时,不满足对象的不变量。