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

the*_*ant 4 java inheritance constructor overriding

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

        }

    }
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

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

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