java初始化问题

corner1988 2011-11-18 08:52:47

class A {
A(int i) {System.out.println("A constructor"); }
}
class B {
B(int i) { System.out.println("B constructor"); }
}
public class C7 extends A {
B b = new B(1);
public C7(int i)
{
super(i); //@1
b = new B(i); //@2
System.out.println("C constructor");
}
public static void main(String[] args) {
C7 c = new C7(10);
}
}
输出为
A constructor
B constructor
B constructor
C constructor

问题有两个1 在@1处 调用父类有参构造函数 为什么没输出A constructor
2 在@2处 有对象进行初始化,但是在构造体内。。从输出来看@2并没有在调用构造函数前完成初始化。为什么?
...全文
102 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamespengo 2011-11-18
  • 打赏
  • 举报
回复
任何一个类的初始化首先是初始化类变量,静态块,然后是成员变量,块,最后是构造方法,对于子类来说,当然是先初始化父类了,没有父亲哪来的儿子,楼上不要乱讲,没有亲自去实践不要擅自下结论
脉动 2011-11-18
  • 打赏
  • 举报
回复

B b = new B(1); ----第二步,非静态成员的初始化在构造函数之前执行

public Main(int i)
{
super(i); //@1----第一步,先进行父类的构造函数调用,
b = new B(i); //@2----第三步,调用构造函数
System.out.println("C constructor");----第四步,
}
呆头熊 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bestmorning 的回复:]

如果一个对象在构造体内生成初始化,那么他的初始化是早于构造体的调用吗?
[/Quote]
是在调用构造函数的时候被初始化的,如果在构造函数外面的话是优先于构造函数。
corner1988 2011-11-18
  • 打赏
  • 举报
回复
如果一个对象在构造体内生成初始化,那么他的初始化是早于构造体的调用吗?
hamxyy 2011-11-18
  • 打赏
  • 举报
回复
3L正解啊
呆头熊 2011-11-18
  • 打赏
  • 举报
回复
@1不是调用了父类A的有参构造函数吗。
@2的话其实是先执行了外面的B b = new B(1);然后执行的里面的b = new B(i);这个顺序应该是初始化基类A,然后初始化C的成员变量,最后是完成C的构造函数里面的内容。
JieTouLangRen 2011-11-18
  • 打赏
  • 举报
回复
@1:第一个输出结果就是
@2:类的初始化顺序为 子类构造函数 -> 父类构造函数 -> 实例化成员变量 -> 继续执行子类构造函数的语句
jtops 2011-11-18
  • 打赏
  • 举报
回复
调用时输出
dong_very_good 2011-11-18
  • 打赏
  • 举报
回复
@1:是有输出的
@2:肯定是要在调用时输出
sidney 2011-11-18
  • 打赏
  • 举报
回复
如果子类构造函数中显示调用了父类指定的构造函数,那么初始化父类时使用的构造函数就是这个指定的构造函数,否则使用父类默认的构造函数。

public C7(int i)
{
super(i); //@1 先打印出A constructor,不是因为这里有super(i)。
b = new B(i); //@2
System.out.println("C constructor");
}

如果你把super(i)去掉,那么C7的父类A必须提供一个无参数的默认构造函数,这时你会发现即使没有super(i),第一个打印出来的还是A constructor。那是因为初始化总是从root class开始逐级向下初始化。每个类在初始化的时候又是先静态变量,静态block,非静态变量,非静态block,再是构造函数。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧