一道Java继承与重写的经典问题

文章详细解释了Java中子类构造方法不显式调用父类构造时的行为,涉及知识点包括构造方法调用顺序、方法重写以及实例变量初始化。当子类调用父类方法时,由于子类实例未完全初始化,导致输出null值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,先上代码

class Base {
    private String name = "base";
    public Base() {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("Base tell name: " + name);
    }
    public void printName() {
        System.out.println("Base print name: " + name);
    }
}
class Dervied extends Base {
    private String name = "dervied";
    public Dervied() {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("Dervied tell name: " + name);
    }
    public void printName() {
        System.out.println("Dervied print name: " + name);
    }
    public static void main(String[] args){
        new Dervied();
    }
}

运行结果是:

Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied

为什么会出现这样的输出结果呢?

知识点1:构造方法。当子类的构造方法不显式调用父类的构造方法时,会默认调用父类的无参构造方法。因此在new Dervied()时,会调用public Base()方法。

知识点2方法重写(覆盖)。当调用Base的构造方法时,会调用tellName()和printName(),然而这两个方法已经在子类中重写,所以会调用Dervied类中的同名方法。然而这个时候,子类还没有实例化,那么实例变量也没有初始化,所以name = null;所以会输出Dervied tell name: null和Dervied print name: null。之后会正常调用子类构造方法,完成对象的创建。

知识点3:代码执行顺序。父类静态块→子类静态块→父类初始化块(成员变量,非静态代码块等)→父类构造方法→子类初始化块(成员变量,非静态代码块等)→子类构造方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值