看下java代码 不懂啊

来源:百度知道 编辑:UC知道 时间:2024/06/19 12:32:01
class A {
public A(){System.out.println("5");}
public A(int a){this();System.out.println("4");}
}
class B extends A{
public boolean B(String s){return false;}
}
public class C extends B{
private C(){ System.out.println("2");}
public C(String s){this();System.out.println("3");}
public C(int i){System.out.println(i);}
public static void main(String[] args){
new C(new Integer("1"));
}
}

代码输出 5 1 我就是不知道怎么输出这个结果,为什么在父类A的第二个构造函数中没有执行this方法后面的打印输出语句?(即:没有输出4)

懂的详解啊 谢啦

new C(new Integer("1"));这句其实是不规范的,用了新版jdk的 自动装箱,
可以自动得把Integer 对象,转换成基本类型 的int,
参数是int,就会调用public C(int i)这 个构造方法,又因为C这个类是继承自B,B又继承自A,所以调用顺序变成了这样:
因为public C(int i)方法没有显式调用父类的构造方法,会调用默认的,无输出,B又会调用A类的默认构造方法,先输出5,最后输出i,也就是 传过去的1.



为什么要调用A的第二个构造函数,明显就是调用第一个嘛。 第二个是需要整形参数的,你又没有给他参数,所以会调用无参的那个啊。

所以调用顺序是 A的第一个构造>>>B的默认构造>>>C的第三个构造。

如果要调用父类的有参构造 是这么写的,super(3);

你的程序中,C类调用new C(new Integer("1")),即public C(int i的构造方法,在输出"1"之前,又因为此式没有显式地调用父类的构造方法,所以调用了super()构造方法,在B类可以看到,它只是起到初始化,实际上什么也没做,又因为它是继承A的,因此,也默认地调用父类的A()构造方法,因此会输出"5",
,之后才输出"1".
记住,一个类如果有父类,在初始化之前,首先要调用父类的构造方法,这也是为什么会先输出5后输出1的原因

我来说一下为什么没有输出4吧,new C(new Integer("1"));这句里的new Integer("1")其实是一个自动解箱过程,new Integer("1")出来的是一个数据1,所以他调用的是类C里的带int类型的构造函数,又因为继承关系,所以它调用了最上面的基类的无参构造函数。调用构造函数是先调用父类的, 所以输出结果为 5 1