weixin_42726160 2020-08-17 18:28 采纳率: 0%
浏览 88
已结题

创建子类实例时,会先调用父类构造函数,这里改变了父类的修饰符,为什么输出结果不一样

public class Solution {
    public static void main(String[] args) {
        new B(6);
    }

    public static class A {
        private int f1 = 7;

        public A(int f1) {
            this.f1 = f1;
            initialize();
        }

        protected void initialize() {// 修饰符protected, 输出为0 9, 为priviate时, 输出6 9
            System.out.println(f1);
        }
    }

    public static class B extends A {
        protected int f1 = 3;

        public B(int f1) {
            super(f1);
            this.f1 += f1;
            initialize();
        }

        protected void initialize() {
            System.out.println(f1);
        }
    }
}

这问题纠结半天还是没懂,我知道当创建子类object时, 会先用到父类的构造函数,然后再是自己的构造函数。

这道题父类的方法为protected void initialize()时, 输出是
0
9

当把父类方法改为priviate void initialize(), 输出是
6
9

请问一下这是为什么?

  • 写回答

3条回答 默认 最新

  • threenewbee 2020-08-17 18:40
    关注

    无论如何,都不应该在构造函数内调用虚成员函数。因为基类构造函数在派生类构造完成之前调用,此时派生类的构造函数没有调用,成员处于不确定的状态。
    你的代码的困惑不必深究,但是这说明这种代码在实际开发中应该杜绝。

    评论

报告相同问题?

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题