我非常有重载构造函数混淆。 构造函数不能被覆盖是当我搜索它在谷歌,我的问题是我得到的结果
public class constructorOverridden {
public static void main(String args[]) {
Sub sub = new Sub();
sub.test();
}
}
class Super {
Super() {
System.out.println("In Super constructor");
test();
}
void test() {
System.out.println("In Super.test()");
}
}
class Sub extends Super {
Sub() {
System.out.println("In Sub constructor");
}
void test() { // overrides test() in Super
System.out.println("In Sub.test()");
}
}
当我运行此我得到的结果作为
In Super constructor
In Sub.test()
In Sub constructor
In Sub.test()
请注意,执行在子类中的试验方法。 是不是表明,父类的构造被覆盖。 无论是正确的吗?
构造函数不是多态的-你不覆盖它们。 创建在子类中构造新的 ,并且每个子类构造函数必须链(可能间接)一个父类的构造。 如果你不明确链构造,对参数的超类构造函数的隐式调用插在子类构造函数体的开始。
现在的首要方法上-一个对象是其“最后型”从一开始,执行超类构造函数时,包括。 所以,如果您打印getClass()
的Super
构造函数代码,你还是会看到Sub
输出。 那其结果是重写的方法(即Sub.test
)被调用,即使Sub
构造尚未执行。
这基本上是一个坏主意,你应该总是避免构造函数调用可能-重写方法-或文档的很清楚 ,这将是这种情况(这样子类代码意识到它不能依靠变量已适当地初始化等)。
作为构造是由它构造类的名称调用不能覆盖的构造。 你怎么能创建具有相同构造一些不同的类? 此外,子类不继承其父的构造函数。
如果父类的构造做了一些重要的初始化,可以从孩子的构造采用超称为:
class Err extends Throwable {
Err(String message) {
super(message); // Call the constructor of Throwable.
..
父类的构造也总是叫。 如果你自己不调用任何,无参数的构造函数是进入派生类的构造函数之前自动调用。 如果家长没有参数的构造函数,你不叫任何,报道编译时错误。
构造函数的第一个隐行是调用Super()
这就是为什么你得到这些结果。
这是正确的。 当实例化一个亚类中,超类构造函数首先被调用,然后在层次结构中的每个连续的构造。
另外,在上述的例子中,超类构造函数调用的重写方法( test()
此作品,但有潜在的危险,因为子类构造函数没有被调用,你的子类没有被完全初始化。 为此调用构造函数重载(或overriddable)方法是不是好的做法。
它没有覆盖超类的构造函数,构造函数不能被重写它可以被重载。
当你创建子类对象超类将被实例化首先然后子类将被实例化。 它像孩子不能没有父母可以存在 。
编译器会自动调用从子类的构造函数的超类的构造函数。
Sub() {
super();
System.out.println("In Sub constructor");
}