java中类初始化问题
package test;
public class A {
public A(){
System.out.println("this is a empty constructor");
}
public A(int i){
System.out.println("this is unempty constructor");
}
public static void main(String[] args){
B b = new B();
}
}
class B extends A{
public B(){
this(1);
}
public B(int i){
super(3);
System.out.println("hah");
}
}
这是一个很神奇的问题,在子类的构造方法中,必须调用父类的构造方法(如果不写的话,默认调用空方法),那么现在这个问题怎么解释呢?····B类中空的构造方法里面没有调用父类的构造方法,new B()的时候,应该先调用父类的构造方法,然后再调用子类的构造方法,那么应该调用A类无参的构造方法吧?···然后B类的构造方法执行之后,然后再执行B类的构造方法,那么这个时候,应该又调用了父类的构造方法super(3)。这个明显是不对的,但到底该怎么解释呢?··
------解决方案--------------------java的语法规定 不可在同一个构造方法中,不可同时出现 super(参数列表)和this(参数列表)
public B(){
this(1);
}
这段代码不会调用super()
因此 你的代码执行顺序是
this(1);
super(3);
public A(int i){
System.out.println("this is unempty constructor");
}
System.out.println("hah");