- 这里的执行顺序主要包括如下几个点:
- 静态代码块
- 静态方法
- 实例方法
- 代码块
- 构造函数
- 父类与子类中以上的顺序
- 直接上实例
//基类
class Base {
private static int a = 1; //基类静态变量,
private int b = 2; //基类成员变量
//基类代码块
{
System.out.println("a="+a+",b="+b);
System.out.println("基类代码块1");
}
//基类静态代码块
static {
System.out.println("a="+a);
System.out.println("基类静态代码块2");
}
//基类代码块2,主要演示两个代码块的执行顺序
{
System.out.println("基类代码块2");
}
//基类构造方法
Base(){
System.out.println("基类初始化");
}
}
//子类
class Sub extends Base {
{
System.out.println("子类代码块1");
//System.out.println("d="+d); //因为变量在后面定义,这里还不能引用到,会有如下编译错误Cannot reference a field before it is defined
}
static {
System.out.println("子类静态代码块");
//System.out.println("c="+c);//静态变量也需要放在前面Cannot reference a field before it is defined
}
private static int c = 3; //子类静态成员变量
private int d = 4; //子类成员变量
Sub(){
System.out.println("子类初始化");
}
{
System.out.println("子类代码块2");
}
}
public class ClassInitTest {
public static void main(String[] args) {
Sub sub = new Sub();
Sub sub1 = new Sub(); //定义两次,主要看静态代码是否还会执行
}
}
输出结果:
a=1 //基类静态成员
基类静态代码块2 //基类静态代码块
子类静态代码块 //子类静态代码块
a=1,b=2 //基类实例变量
基类代码块1 //基类代码块
基类代码块2
基类初始化 //基类构造方法
子类代码块1 //子类代码块
子类代码块2
子类初始化 //子类构造方法
a=1,b=2 //第2次初始化,与静态相关的,就没有什么关系了
基类代码块1
基类代码块2
基类初始化
子类代码块1
子类代码块2
子类初始化
- 总结
总体执行顺序如下:
1)基类静态成员变量、基类静态代码块 (按代码前后)
2)子类静态成员变量、子类静态代码块(按代码前后)
3)基类实例变量、代码块 (按代码前后)
4)基类构造方法
5)子类实例变量、代码块(按代码前后)
6)子类构造方法
网友评论