见下面的例子:
class A {
A() { this(1); }
A(int i) { System.out.println("A" ); }
}
class B extends A {
B() {}
B(int i) { System.out.println("B" ); }
}
public class Test
{
public static void main(String[] args) {
A o = new B();
}
}
输出:
A
Q1:似乎java没有对“this(1)”执行后期绑定。它已在编译时决定。请确认。
Q2:Java不对任何构造函数执行后期绑定。请确认。
问题3:这是否意味着构造函数是隐式最终的?
答案 0 :(得分:7)
您无法覆盖构造函数。它们根本不遵循继承规则。他们不能遵循inhertitance规则,因为你需要一个简单的命令来构建你的对象。
e.g。在你的例子中,如果你可以覆盖A(int)构造函数,A()将调用B(int),但是B(int)隐式调用super(),它是A()并且你有无限递归。
构造函数调用可覆盖方法通常被认为是不好的做法。因此,让构造函数自动执行此操作将是一个非常糟糕的主意。
如果构造函数是最终的,就像static final
方法一样,你也无法隐藏它们,但你可以,所以我会说它们也是final
。
答案 1 :(得分:2)
Java不会覆盖构造函数。
A o = new B();
它将调用B(),其中它将调用super()。
A()
将被调用,在这里你调用this(1)
,这意味着它将调用A(1)
所以没什么奇怪的。当你谈论构造函数时,在编译时决定一切。
数目:
Q1:Seems java does not perform late binding for "this(1)". It has been decided at compile-time.Please confirm.
是的,只有在编译时才能确定构造函数。
Q2:Java does not perform late binding on any constructors. Please confirm.
因为没有覆盖所以没有后期绑定。
Q3:Does this mean constructors are implicitly final?
不,他们不是最终的,但你无法覆盖它们。
修改强>
A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass
。 Refer Java Docs
答案 2 :(得分:1)
Q1:是的
Q2:这不是关于构造函数的,更多的是关于这一点。这总是指在类或超类中存在的方法/字段,而不是在子类中。这是有道理的,因为父母不知道孩子的实施
Q3:种类,构造函数是特殊方法,因为它们被链接而没有意义覆盖它们
答案 3 :(得分:0)
创建子类的实例时,必须调用超类的构造函数。
如果未指定构造函数,则会为您调用默认(no-args)构造函数。
换句话说,B
中的no-args构造函数实际执行为:
B() {
super();
}
答案 4 :(得分:0)
当您实例化子类构造函数时,它首先在执行自己的任务之前调用其超类的默认构造函数。这是通过隐式或super()
引用来完成的。
因此,对B()
的调用会调用构造函数A()
,它将调用A(1)
同样,如果你调用B(2)
输出将是(它将调用默认构造函数A()然后调用A(1)
A
B
答案 5 :(得分:0)
'“this()”没有被覆盖'没有任何意义,也没有任何其他问题。
这里发生的一切是B
的构造函数都隐式调用super()
,因为你没有编写任何其他代码,而super()
是A()
,它调用this(1)
。