class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
} public class Z extends X {
//Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
如上代码,输出是YXZ,将注释去掉后为什么变成了YXYZ,主要是后三个字母,为什么X和Y的输出先后顺序不一样了,谁能帮我从底层对象创建方面分析透彻一点,有点搞不清。
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
} public class Z extends X {
//Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
如上代码,输出是YXZ,将注释去掉后为什么变成了YXYZ,主要是后三个字母,为什么X和Y的输出先后顺序不一样了,谁能帮我从底层对象创建方面分析透彻一点,有点搞不清。
解决方案 »
- 如何用java将一个字符串中的所有的http链接都加入<a href="url">url</a>标签
- 字符串“0x410f5e82”怎样解释为十进制的浮点数??
- SSH整合报错sessionFactory创建异常
- String问题IBM面试
- xml如何通过xsl展现
- JBuilder中配置新的JDBC驱动问题,请高手指教
- 有约束条件的极值问题.
- 关于用FOR循环写STARS(*)的问题
- 有没有在tomcat中成功配置https的?救救我吧,已经几天了!!!!!
- 100分:如何判断一个数是不是质数
- 在Java socket编程的时候,应该如何合理的关闭socket
- 各位大神,如何用TableModel实例化JTable?
看看这个:
http://wenwen.soso.com/z/q191435823.htm
第二次输出的YXYZ,与第一次相比,输出顺序并没有变化,XZ之间多了一个Y,是由于Y y = new Y();在Z()之前构造,但又必须在父类构造完成之后。
在执行类的构造函数之前,是先初始化类的成员变量的。所以,去掉注视之后,初始化顺序是这样的:
先初始化父类 X();
在初始化X时,先构造成员变量Y; 输出Y
然后,执行X的构造函数;输出X
然后,初始化Z自身的成员变量Y;输入Y
最后,执行Z的构造函数;输出Z在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧在任何方法(包括构造器)被调用之前得到初始化。
问题:派生类的Static方法,默认构造方法,和派生方法,父类和子类的加载顺序是什么?搞明白这个问题,你的疑问就迎刃而解了。
Y y = new Y(1); X() {
System.out.println("X");
}
}class Y {
Y(int i){
System.out.println("Y " + i);
}
}public Z Test extends X {
Y y = new Y(2); Z() {
System.out.println("Z");
} public static void main(String[] args) {
new Z();
}
}