正如我所知,构造函数,Instance Initialization块不会继承到子类,但是下面的代码继承了超类构造函数,它为什么要调用?
预期的产出是:来自缺点2
但它的显示输出如下:--IIB--来自cons 2来自cons 2
WHY? this output , *As i know "sub class should not inherit Constructor & IIB block"*
Run Code Online (Sandbox Code Playgroud)
请帮我弄清楚这个概念.
public class X
{
{
System.out.println("--IIB--");
}
X()
{
System.out.println("from cons 1");
}
}
class Y extends X
{
Y()
{
System.out.print("from cons 2");
}
}
class Z
{
public static void main(String args[])
{
Y ob=new Y();
}
}
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为:
Y()
{
System.out.print("from cons 2");
}
Run Code Online (Sandbox Code Playgroud)
实际上成了
Y()
{
super(); //Call to X's constructor made here even if you don't call it
System.out.print("from cons 2");
}
Run Code Online (Sandbox Code Playgroud)
原因是每个人Y都是一个例子X.在任何子构造函数执行之前,必须首先调用该父构造函数,以保证父属性已准备就绪.
编辑:这是显示"超类构造函数不由子类继承"的示例:
class A {
A(int intForA) {
//Do stuff...
}
}
class B extends A {
B() {
this(3); //Won't compile! A's constructor isn't inherited by B
}
}
Run Code Online (Sandbox Code Playgroud)
相反,我们这样做:
class B extends A {
B() {
super(3); //This compiles; we're calling A's constructor from B
}
}
Run Code Online (Sandbox Code Playgroud)