情况一:当一个类继承于另一个类时。 规则:成员变量,构造代码块,构造方法。这三者中,无论顺序怎样,构造方法都是最后执行的。而成员变量,构造代码块是顺序执行,谁在前谁先执行。
1、先加载父类(有静态代码块就执行),后加载子类(有静态代码块就执行)。--->(先执行静态代码块)
2、接着执行main方法中的代码(假设是创建该子类对象),创建该子类对象时,会先执行父类中空参构造方法,(根据以上规则,如果有成员变量 和构造代码块就先于构造方法执行),再执行子类构造方法。(根据以上规则,如果有成员变量和构造代码块就先于构造方法执行)。
情况二:当一个类没有继承于另一个类时。 1、直接先加载子类(有静态代码块就执行)。--->(先执行静态代码块)
2、接着执行main方法中的代码(假设是创建该类对象),创建该类对象时,会执行该类对应的构造方法。(根据以上规则,如果有成员变量和构造代码块就先于构造方法执行)。
每进入到一个类中时就按情况一或者情况二分析。欢迎大家批评指正!
以下数字(1,2,3.........)代表输出顺序。
class W {
{System.out.println("W构造代码块----10"); }
static{System.out.println("W静态代码块----9");}
W() {
System.out.println("W构造方法---11");
}
}
class Y {
{System.out.println("Y构造代码块----5"); }
static{System.out.println("Y静态代码块------4");}
Y() {
System.out.println("Y构造方法....6");
}
}
class X {
{System.out.println("X构造代码块---------3"); }
static{System.out.println("X静态代码块------1");}
Y b = new Y();
X() {
System.out.println("X构造方法....-----7");
}
}
public class Z extends X {
{System.out.println("Z构造代码块---8"); }
W w = new W();
Z() {
super();
System.out.println("Z构造方法....12");
}
static{System.out.println("Z静态代码块-------2");}
public static void main(String[] args) {
//{System.out.println("Z局部代码块"); }
new Z();
}
} |
|