自己做了几遍,每次的输出结果都不一样。有时候父类的构造方法中的两个输出中竟然会穿插子类的非静态类方法体。按照网上http://blog.csdn.net/fang3081004/article/details/7764306的做法,没有再出现不稳定的情况。索性就这样总结了:
1. 单一类中:静态变量、静态块、普通变量、普通块、构造方法;
2. 有继承的子类中:先父后子。子类的静态变量和静态块会插队在父类静态块的后面,以后才严格尊重父亲大人。
创建顺序:
1。按照顺序执行父类静态变量、静态块
2。按照顺序执行子类静态变量、静态块
3。构造父类:按照顺序执行父类的普通变量、普通块
执行父类的构造函数
4。构造子类:按照顺序执行子类的普通变量、普通块
执行子类的构造函数
示例如下:(需要用debug进行调试才可以看到变量的顺序)
package ms;
public class MS_Extends {
public static void main(String[] args) {
//A a = new A();
B b = new B();
//A a = new B();
}
}
class A{
public static int a = 0;
public int b = 0;
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数前");
}
public A(){
System.out.println("■父类 - 构造函数");
}
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数后");
}
}
class B extends A{
public static int a = 0;
public int b = 0;
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数前");
}
public B(){
System.out.println("◆子类 - 构造函数");
}
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数后");
}
}
运行结果:
■父类 - 静态初始块 - 位置是构造函数前
■父类 - 静态初始块 - 位置是构造函数后
◆子类 - 静态初始块 - 位置是构造函数前
◆子类 - 静态初始块 - 位置是构造函数后
■父类 - 普通初始块 - 位置是构造函数前
■父类 - 普通初始块 - 位置是构造函数后
■父类 - 构造函数
◆子类 - 普通初始块 - 位置是构造函数前
◆子类 - 普通初始块 - 位置是构造函数后
◆子类 - 构造函数