构造函数中调用其他的方法会产生的问题

本文通过一个Java示例展示了子类构造过程中父类构造器调用子类被重写方法时可能遇到的问题。当子类实例变量未初始化前,父类构造器中调用子类的方法可能会导致意外结果。

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

看代码
class Base{
private int val;
//构造函数,调用lookup()方法
Base() {
val = lookup();
}

public int lookup() {
return 5;
}
public int value(){
return val;
}
}
//子类,继承父类,并重写lookup()方法
class SubClass extends Base{
private int num = 10;
public int lookup(){
return num;
}
}
//测试一下
public class Test {
public static void main(String[] args) {
SubClass sc = new SubClass();
System.out.println("sc.value()="+sc.value());
}
}
打印结果:
sc.value()=0


结果很奇怪,会打印出0,分析了一下,造成[b]原因[/b]是这样的:
1.初始化子类对象,会调用子类的构造器,子类的构造器的第一步就是调用父类的构造器,这个是自动隐式的写在了子类构造器的第一行(必须是第一行),原因肯定都知道了,因为子类继承了父类,父类的属性和方法会给子类一些,所以在子类初始化之前,先要保证父类初始化成功了。
2.现在调用到了父类的构造器,父类的构造器会调用lookup()方法
3.问题来了,这里会调用子类的lookup()方法
4.但是子类的num现在还没有初始化,是默认值0(类加载的时候通过内存清0,来实现实例变量的默认初始值),所以打印出0。
这种问题虽然很难碰到,但是如果碰到了,知道怎么回事,可以节省许多时间。

附上类初始化的顺序

[quote]引用自: 臧圩人
1. 父类--静态变量
2. 父类--静态初始化块
3. 子类--静态变量
4. 子类--静态初始化块
5. 父类--变量
6. 父类--初始化块
7. 父类--构造器
8. 子类--变量
9. 子类--初始化块
10. 子类--构造器 [/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值