黑马程序员技术交流社区
标题: 对象初始化顺序问题 [打印本页]
作者: sam9204 时间: 2014-6-9 22:50
标题: 对象初始化顺序问题
本帖最后由 sam9204 于 2014-6-10 22:45 编辑
下面是People和Child类的定义和构造方法,每个构造方法都输出编号。在执行new Child("mike")的时候都有哪些构造方法被顺序调用输出结果是什么?
class People {
String name;
public People() { System.out.print(1); }
public People(String name) {
System.out.print(2);
this.name = name;
}
}
class Child extends People {
People father = new People();
static People f2 = new People("1");
public Child(String name) {
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
public Child(){ System.out.print(4); }
}
最后输出结果是:21132。但不知其所以然,请高手帮我分析一下具体的对象初始化顺序,谢谢。修正了一下答案应该是21132
作者: shisishishisi 时间: 2014-6-9 23:07
这代码贴的。。。果断看不懂
作者: xp8812 时间: 2014-6-9 23:12
本帖最后由 xp8812 于 2014-6-9 23:18 编辑
能看下你的主函数是如何调用的吗?,你的代码是从哪里复制过来的这么多的错误你没检查吗?
作者: sam9204 时间: 2014-6-10 08:49
请先看题目,谢谢
作者: sam9204 时间: 2014-6-10 08:51
这是一道面试题,题目已经说明----在执行new Child("mike")的时候都有哪些构造方法被顺序调用
作者: shisishishisi 时间: 2014-6-10 10:11
本帖最后由 shisishishisi 于 2014-6-10 10:12 编辑
现在比之前贴的好多了
分析:
首先你的static People f2 = new People("1");是静态的,也就是说不管你是创建什么参数的Child对象,这个静态变量都是先加载的,所以当类第一次加载的时候必然先输出的是2,
PS:你可以用
new Child();//2114
new Child("mike");//1132,因为Child类已经加载,静态变量f2已经存在
和单独用:
new Child("mike");//21132
来验证
然后才轮到:People father = new People();
这里调用People的空参数构造函数输出1没什么好说的
接下来:
public Child(String name) {
//super();
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
只要知道每个构造函数第一行都有一个隐式的super();语句就不难理解了
最后调用People的带参数构造方法输出2
over
作者: sam9204 时间: 2014-6-10 22:44
嗯,基本搞定了,之前就是忘了有这个(每个构造函数第一行都有一个隐式的super();),谢谢啦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |