class X
{
y b=new y();
X(){
System.out.println("X");
}
}
class y{
y(){
System.out.println("y");
}
}
public class Z extends X {
y y=new y();
Z(){
System.out.println("z");
}
public static void main(String[] args) {
new Z();
}
}
{
y b=new y();
X(){
System.out.println("X");
}
}
class y{
y(){
System.out.println("y");
}
}
public class Z extends X {
y y=new y();
Z(){
System.out.println("z");
}
public static void main(String[] args) {
new Z();
}
}
new Z()这个语句就是去执行Z的构造方法
因为Z是X的子类,在Z的构造方法里会默认先调用其父类X的无参的构造方法,然后再执行自己的构造方法;因此得出结果xz
所以先执行main.main函数中new本身。
有因为Z继承了X,所以就先执行X,又X中先new Y,所以跳转到Y中,-----输出Y
再返回到X中,------输出X
这样X执行完了,返回到子类Z中,先new Y,去执行Y---->输出Y
再返回到Z中,最后输出Z记住一点:new对象会在任何函数包括构造函数之前执行(不过New在什么位置,都会优先执行)。
你单步调试下就明白了
class中的初始化次序取决于class中变量的定义次序,变量定义可能散落各处,而且可能介于各种函数定义之间,但所有变量一定会在任何一个函数(甚至是构造函数)被调用之前完成初始化。
y y=new y(2);
TEST(){
super(3);
System.out.println("z");
}
public static void main(String[] args) {
new TEST();
}
} class X
{
y b=new y(3);
X(){
System.out.println("X");
}
X(int i){
System.out.println("X"+i);
}
} class y{
y(){
System.out.println("y"); } y(int j){
System.out.println("Y"+j);
} }
你这样运行下 就知道了··加了点参数
class X
{
y b=new y();
X(){
System.out.println("X");
}
}
class y{
y(){
System.out.println("y");
}
}
public class Z extends X {
private int i;
y y=new y(); //是类变量
Z(){
System.out.println("z");
}
public static void main(String[] args) {
Z testZ = new Z();
System.out.println(testZ.i);
/*
* 1.创建对象时先调用构造方法,而构造方法对没有处理的类变量进行
* 默认初始化。
* 2.对子类初始化时,先调用父类构造方法,后调用子类构造方法
* 所以输出: y
X
y
z
*/
}
}