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

标签 java inheritance constructor overriding

<分区>

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

        }

    }

最佳答案

首先执行父类(super class)构造函数。所以当重写的方法被调用时,子构造函数还没有执行,所以子类中的id字段仍然有它的默认值。

这就是为什么从构造函数调用可重写的方法是一种不好的做法,被 PMD 等工具标记为:当调用这样的方法时,对象的不变量没有实现。

关于java - 子类构造函数中的重写函数 (JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552215/

相关文章:

java - 多种语言的随机数

java - 如何重写父类方法以在该方法的开头和结尾执行某些工作?

python - 为什么 Python 中的基类需要扩展对象?

c++ - 为什么我不能更改 vector 中的对象?

java - 我将如何跨多行搜索一串单词

Java加载图像更快

java - “在子类实例化期间,父类(super class)的私有(private)字段是否也在堆内存中占有一席之地?

haskell - 具有默认字段且需要与其配合使用的函数的数据类型

c++ - 基本类型的 static_cast<T> 与 T(n)

Java 8 流 - 链中的每个步骤都针对整个输入进行评估,还是项目通过?