看下java代码 不懂啊

[复制链接]
查看11 | 回复4 | 2008-9-13 22:50:53 | 显示全部楼层 |阅读模式
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)
懂的详解啊谢啦

回复

使用道具 举报

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

使用道具 举报

千问 | 2008-9-13 22:50:53 | 显示全部楼层
new C(new Integer("1"));这句其实是不规范的,用了新版jdk的 自动装箱,可以自动得把Integer 对象,转换成基本类型 的int,参数是int,就会调用public C(int i)这 个构造方法,又因为C这个类是继承自B,B又继承自A,所以调用顺序变成了这样:因为public C(int i)方法没有显式调用父类的构造...
回复

使用道具 举报

千问 | 2008-9-13 22:50:53 | 显示全部楼层
晕为什么要调用A的第二个构造函数,明显就是调用第一个嘛。 第二个是需要整形参数的,你又没有给他参数,所以会调用无参的那个啊。所以调用顺序是 A的第一个构造>>>B的默认构造>>>C的第三个构造。如果要调用父类的有参构造 是这么写的,super(3);...
回复

使用道具 举报

千问 | 2008-9-13 22:50:53 | 显示全部楼层
我来说一下为什么没有输出4吧,new C(new Integer("1"));这句里的new Integer("1")其实是一个自动解箱过程,new Integer("1")出来的是一个数据1,所以他调用的是类C里的带int类型的构造函数,又因为继承关系,所以它调用了最上面的基类的无参构造函数。调用构造函数是先调用父类的, 所以输出结果为 51...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行