时间:2023-04-14
标签: #Java #多态 #构造器 #动态绑定 #隐蔽的bug
如果在构造器中调用了动态绑定方法,就会用到那个方法的重写定义。然而,调用的结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些 bug 很隐蔽,难以发现。
———
为什么调用结果是难以预料的,举例解释下? 为什么这些 bug 就是隐蔽的了呢?
调用构造器中动态绑定方法的结果难以预料,是因为在对象完全构造出来之前,重写的方法就已经被调用。这可能导致不完全初始化的对象状态或数据。我们来看一个例子:
class Base {
public Base() {
show(); // 动态绑定方法
}
public void show() {
System.out.println("Base show");
}
}
class Derived extends Base {
private int value = 10;
@Override
public void show() {
System.out.println("Derived show, value: " + value);
}
}
public class Main {
public static void main(String[] args) {
Derived derived = new Derived();
derived.show();
}
}
输出:
Derived show, value: 0
Derived show, value: 10
在这个例子中,Derived
类继承了 Base
类,并重写了 show()
方法。当我们创建一个 Derived
类的实例时,会先调用父类 Base
的构造器。在 Base
构造器中,调用了动态绑定方法 show()
,此时会调用 Derived
类中重写的 show()
方法。然而,此时 Derived
类的构造器尚未执行,value
字段还没有被初始化为 10,所以输出的 value
值是 0。这就是为什么调用结果难以预料。
这些bug隐蔽的原因是,程序员可能没有意识到在构造器中调用动态绑定方法会导致这样的问题,而且问题表现为数据不一致,这使得在调试时难以发现问题的根源。因此,在构造器中调用动态绑定方法可能导致难以追踪和定位的bug。