A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马伍仪华 中级黑马   /  2012-3-3 20:44  /  2215 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 375809600 于 2012-3-3 20:45 编辑

.


关于构造方法的一点疑惑,为什么父类的构造方法之后还调用了其他的构造方法?


表述不清,直接上代码

class A {
A(){
System.out.println("A()");
}
A(int i){
System.out.println("A(1)");

}
}

class B  {
B(){
System.out.println("B()");
}

}
class C extends A{
B b=new B();
C(){
super(5);
System.out.println("C()");
}

}

public class Fifth {

public static void main(String[] args) {
// TODO Auto-generated method stub
C c=new C();

}

}
输出是:
A(1)
B()
C()
问题是为什么在A(1)之后才出B(),这样等于c的构造方法被打断了不是麽?新手就执教

7 个回复

正序浏览
程序是一句一句执行的
class C extends A{
B b=new B();
C(){
super(5);
System.out.println("C()");
}
new一个 c类的过程 在 c类内部先创建b类b类就初始化执行打印语句
然后再初始化c类的构造函数、 初始化的过程先执行super(5)。这句就调用了父类的带参数的构造函数、就打印出a(1),最后执行System.out.println("C()");



这应该不难理解吧
回复 使用道具 举报
首先调用父类的构造函数对父类进行初始化,然后父类在调用自己的构造函数对自己进行初始化。当我们new c()时调用super(5); ,然后调用B的构造函数,再就是调用c的构造函数。所以先A(1) --> B() --> C()


回复 使用道具 举报
因为c继承了A,在c的构造中super(5); 又调用了A的带参构造,所以结果是先A(1)。
回复 使用道具 举报
本帖最后由 王国华 于 2012-3-3 21:40 编辑

Java初始化顺序:先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
刚查到的。。

回复 使用道具 举报
帮你查了一些知识
new对象的时候首先是调用父类构造函数(如果是用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数),然后按顺序分别调用类成员变量和实例成员变量的初始化表达式,调用类本身构造函数。
回复 使用道具 举报
看得晕乎乎的。。。
回复 使用道具 举报
难道调用构造函数对类进行初始化时,先调用父类的构造函数进行初始化,然后如果本类还创建了别的对象,将先初始化这个对象,然后在继续原来的构造函数吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马