new对象时,代码的执行顺序

一、静态变量和静态代码

public class Test05 {

    public static void main(String[] args) {
        Test005 test = new Test005();
    }

}

class Test005 {

    //1. 静态代码块

    static {
        System.out.println("静态代码块执行了");
        System.out.println("a = "+Test005.a);//0
        a = -1;
        System.out.println("a = "+Test005.a);//-1
    }

    //2. 静态变量
    static int a = 100;

    //3. 构造器
    public Test005() {
        System.out.println("构造器执行了");
        System.out.println("a = "+Test005.a);//100
    }

}
/*
静态代码块执行了
a = 0
a = -1
构造器执行了
a = 100
*/
  • 从运行结果来看
    • 加载类的时候先声明了静态变量a,默认值为0
    • 顺序执行到静态代码块初始化a = -1
    • 再顺序执行到构造器静态变量赋值a = 100
  • 由于静态代码块初始化值后,静态变量又一次重新赋值了
    • 因此把静态变量写在静态代码块后是无意义的
    • 不管是否在静态代码块中使用静态变量, 都应把静态变量写在静态代码块的上方

二、非静态代码块

在明确了静态变量与静态代码块是按顺序执行后,再来看看加入非静态代码块后的执行顺序

public class Test05 {

    public static void main(String[] args) {
        Test005 test = new Test005();
    }

}

class Test005 {
    //3. 非静态代码块
    {
        System.out.println("非静态代码块执行了");
        System.out.println("a = "+Test005.a);//-1
        a = 50;
        System.out.println("a = "+Test005.a);//50
    }

    //1. 静态变量
    static int a = 100;

    //2. 静态代码块
    static {
        System.out.println("静态代码块执行了");
        System.out.println("a = "+Test005.a);//100
        a = -1;
        System.out.println("a = "+Test005.a);//-1
    }

    //4. 构造器
    public Test005() {
        System.out.println("构造器执行了");
        System.out.println("a = "+Test005.a);//-1
    }

}
/*
静态代码块执行了
a = 100
a = -1
非静态代码块执行了
a = -1
a = 50
构造器执行了
a = 50
*/
  • 从运行结果来看
    • 非静态代码块运行静态变量和静态代码块之后,在构造器之前

三、如果存在继承关系

public class Test05 {

    public static void main(String[] args) {
        Test0005 test = new Test0005();
    }

}

class Test0005 extends Test005{
    //5. 静态变量
    static int b;

    //5. 静态代码块
    static {
        System.out.println("子类静态代码块执行了");
        System.out.println("a = "+Test0005.b);//0
        b = -1;
        System.out.println("a = "+Test0005.b);//-1
    }

    //非静态代码块
    {
        System.out.println("子类非静态代码块执行了");
        System.out.println("a = "+Test0005.b);//-1
        b = 100;
    }

    //6. 子类构造器
    public Test0005() {
        System.out.println("子类构造器执行了");
        System.out.println("b = "+Test0005.b);//100
        System.out.println("b = "+b);//100
    }
}


class Test005 {
    //3. 非静态代码块
    {
        System.out.println("父类非静态代码块执行了");
        System.out.println("a = "+Test005.a);//-1
        a = 50;
        System.out.println("a = "+Test005.a);//50
    }

    //1. 静态变量
    static int a = 100;

    //2. 静态代码块
    static {
        System.out.println("父类静态代码块执行了");
        System.out.println("a = "+Test005.a);//100
        a = -1;
        System.out.println("a = "+Test005.a);//-1
    }

    //4. 构造器
    public Test005() {
        System.out.println("父类构造器执行了");
        System.out.println("a = "+Test005.a);//-1
    }

}
/*
父类静态代码块执行了
a = 100
a = -1
子类静态代码块执行了
a = 0
a = -1
父类非静态代码块执行了
a = -1
a = 50
父类构造器执行了
a = 50
子类非静态代码块执行了
a = -1
子类构造器执行了
b = 100
b = 100
*/
  • 从运行结果来看
    • 先执行静态部分(静态变量、静态代码块)
      • 父类执行完再执行子类
    • 执行完静态部分后,再执行非静态部分(非静态代码块、构造器)
      • 父类执行完再执行子类

四、总结

1. 静态 => 非静态

  • 类内容(静态变量、静态初始化块)=> 实例内容(变量、初始化块、构造器)

2. 父类 => 子类

  • 父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)
posted @ 2020-12-04 19:18  球球z  阅读(224)  评论(0)    收藏  举报