日期:2014-05-20  浏览次数:20705 次

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类的初始化

------解决方案--------------------
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");