public class ExtAA extends AA {
static int iTime;
public static void main(String argv[]) {
ExtAA d = new ExtAA();
d.func(iTime);
}
public static void func(int iTime) {
System.out.println(iTime);
}
public ExtAA() { }
}
class AA {
public AA() { System.out.println("AA"); }
}
打印:
AA
0
我原本希望public ExtAA() { }
覆盖AA
的构造函数,因此不会打印AA,只需0
。有人可以用什么方式解释我错了,如果我想覆盖构造函数怎么办?
P.S。我的问题完全有可能是愚蠢的,但我不知道公共ExtAA()
{}应该或可以做什么。这是一个测试,我搞砸了,我想知道实际发生了什么(是的,我确实进入调试并逐步进行调试,我只是不知道为什么new ExtAA
使用{{ 1}}而不是它自己定义的构造函数)
答案 0 :(得分:5)
总是调用Java中超类的构造函数。你不能阻止它。如果有更多的构造函数,你可以控制它们被调用。
请考虑阅读一些Java的基础教程,这是Java OOP的基本内容。
隐式地,您的构造函数看起来像这样:
public ExtAA() {
super(); // Constructor of super class call, always first line of code in child constructor
}
答案 1 :(得分:2)
想象一下,如果你可以从基础跳过构造函数。它可能使对象的父部分处于极不稳定的状态。
考虑基类在构造函数中进行某种有意义的初始化的情况。如果没有完成,那么突然你的对象的基类部分处于疯狂城镇。这几乎可以肯定Java决定像这样工作的原因。
作为一个非常简单的例子,假设您有一个扩展ArrayList的SortedArrayList类。如果SortedArrayList以某种方式没有调用任何ArrayList构造函数,你认为该对象的内部是否有意义?某处会有一个无效的数据结构,意味着事情会崩溃和燃烧。在某些情况下,覆盖构造函数可能是有意义的,但显然Java人员认为意外执行此操作的风险并不值得(并且非常在设计良好的类中很少有意义) graph - 如果子类在某种程度上不依赖于基类,那么为什么它以子类开头?)。
答案 2 :(得分:2)
对象具有自己的类的字段加上其父类的祖父类,祖父类的所有字段,一直到根类Object。有必要初始化所有字段,因此必须调用所有构造函数! Java编译器会在构造函数链接过程中自动插入必要的构造函数调用,或者您可以显式地执行它。