Java 爪哇:为什么;这是我的建议;是否不被覆盖?
请参见以下示例:Java 爪哇:为什么;这是我的建议;是否不被覆盖?,java,constructor,overriding,this,final,Java,Constructor,Overriding,This,Final,请参见以下示例: 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
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
问题1:java似乎没有为“this(1)”执行后期绑定。编译时已决定。请确认
问题2:Java不会对任何构造函数执行后期绑定。请确认
问题3:这是否意味着构造函数是隐式最终的?当您创建子类的实例时,必须调用超类的构造函数 如果未指定构造函数,则会为您调用默认(无参数)构造函数 换句话说,
B
中的no args构造函数实际上执行为:
B() {
super();
}
不能重写构造函数。他们根本不遵循继承规则。它们不能遵循固有性规则,因为构建对象需要一个简单的顺序 e、 在你的例子中,如果你可以重写A(int)构造函数,A()会调用B(int),但是B(int)隐式调用super(),super()是A(),你有无限递归 构造函数调用高估方法通常被认为是不好的做法。因此,让构造函数自动执行此操作将是一个非常糟糕的主意 如果构造函数是final的,比如
static final
方法,你也不能隐藏它们,但是你可以,所以我想说它们也是final
。问题3:某种程度上,构造函数是一种特殊的方法,重写它们没有意义,因为它们是链接的Java不会重写构造函数
ao=新的B();
它将调用B(),其中它将调用super()
A()
将被调用,在这里您将调用this(1)
,这意味着它将调用A(1)
,所以没有什么奇怪的。当您谈论构造函数时,一切都是在编译器时决定的
答复:
Q1:java似乎没有对“this(1)”执行后期绑定。编译时已决定。请确认。
是的,只有在编译时才决定构造函数
Q2:Java不会对任何构造函数执行后期绑定。请确认。
因为没有覆盖,所以没有后期绑定
Q3:这是否意味着构造函数是隐式最终的?
不,它们不是最终的,但您不能覆盖它们
编辑:
子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但是可以从子类调用超类的构造函数
实例化子类构造函数时,它首先调用其超类的默认构造函数,然后再执行自己的任务。这是通过隐式方式或通过super()
reference完成的
因此,对B()
的调用将调用构造函数a()
,后者将调用a(1)
类似地,如果调用B(2)
,输出将是(它将调用默认构造函数A(),然后调用A(1)
“this()”未被重写“没有任何意义,您的任何其他问题也没有任何意义
这里发生的一切是
B
的构造函数都隐式地调用super()
,因为您没有编写任何其他代码,super()
是A()
,它调用this(1)
相关:这并不能解决问题。他知道A::A()被隐式调用。他不明白为什么A::A()中的this(1)
调用A::A(1)
而不是B::B(1)
。
A
B