静态代码块、构造方法、构造代码块、变量、静态变量的执行顺序详解

静态代码块

​ 用static声明,jvm加载类的时候执行。仅执行一次

​ 【注意事项】:记住一句话,静态的东西和对象无关

构造代码块

​ 类内直接使用{}。每一次创建对象的时候执行。

执行优先顺序:静态代码块 > 构造代码块 > 构造方法

若在一个类中,含有成员变量,构造代码块,构造方法。

执行流程:成员变量| 构造代码块 > 构造方法

【注意事项】:
1.java编译器编译一个源文件的时候,会把成员变量的声明语句提高至最顶端。
2.成员变量的初始化以及代码块的代码都会移到构造方法中标去执行。
3.成员变量和构造代码块的顺序大部分是按照代码的顺序执行的。构造方法会最后执行。

示例

//比较构造代码块和构造方法的优先级
public class Demo1 {
    
    
    //成员变量
    public int num = 1000;
    //构造方法
    public Demo1() {
    
    
        this.num = 3000;
    }
    //构造代码块
    {
    
    
        this.num = 2000;
    }

    public static void main(String[] args) {
    
    
        Demo1 demo1 = new Demo1();
        System.out.println(demo1.num);
    }
}

运行结果:

3000

构造方法

		public Hello() {
			}

【注意事项】:
1、对象一创建,就会调用与之对应的构造方法。也就是说,不建立对象,构造方法不执行。
2、对对象进行初始化的。
3、一个对象创建,构造方法只运行一次,再创建一个对象,再运行一次。

构造代码块

{
代码块;
}
【注意事项】:
1、构造代码块是给对象进行初始化的。
2、对象一建立就运行构造代码块,而且优先于构造方法。强调!!!:有对象才能执行构造代码块。
3、类不能调用构造代码块。

静态代码块

static {
代码块;
}
【注意事项】
1、随着类的加载而执行的,并且只执行一次,并且优先于main主函数。具体来讲,静态代码块是由类来调用的。
2、静态代码块是对类进行初始化的,构造代码块是对对象进行初始化的。
3、静态代码中的变量,是一个局部变量,和普通的局部变量没有任何区别。
4、一个类中可以有多个静态代码块。

示例

public class Demo2 {
    
    

    //成员变量
    static int cut = 6;

    //静态代码块
    static  {
    
    
        cut += 9;
    }

    public static void main(String[] args) {
    
    
        System.out.println(cut);
    }

    //静态代码块
    static {
    
    
        cut /= 3;
    }
}

执行结果:

5

java类初始的顺序

对于一个类,静态代码块只要类加载就执行

示例1

public class HelloA {
    
    

    public HelloA() {
    
    
        System.out.println("构造方法");
    }

    {
    
    
        System.out.println("构造代码块");
    }

    static {
    
    
        System.out.println("静态代码块");
    }

    public static void main(String[] args) {
    
    
    
    }
}

运行结果:

静态代码块

示例2

public class HelloA {
    
    

    public HelloA() {
    
    
        System.out.println("构造方法");
    }

    {
    
    
        System.out.println("构造代码块");
    }

    static {
    
    
        System.out.println("静态代码块");
    }

    public static void main(String[] args) {
    
    
        HelloA helloA = new HelloA();
    }
}

运行结果:

静态代码块
构造代码块
构造方法

示例3

public class HelloA {
    
    

    public HelloA() {
    
    
        System.out.println("构造方法");
    }

    {
    
    
        System.out.println("构造代码块");
    }

    static {
    
    
        System.out.println("静态代码块");
    }

    public static void main(String[] args) {
    
    
        HelloA helloA = new HelloA();
        HelloA helloA1 = new HelloA();
    }
}

运行结果:

静态代码块
构造代码块
构造方法
构造代码块
构造方法

变量和静态变量

1.先去执行静态代码块

2.执行构造代码块

3.执行构造方法

对于静态变量,静态的代码块,变量,代码块,构造方法。他们初始化的顺序:(静态变量,静态代码块)>(变量,代码块)>构造方法

示例

public class InitTest {
    
    
    //静态变量
    public static String staticField = "静态变量";
    //变量
    public String field = "变量";
    //静态代码块
    static {
    
    
        System.out.println(staticField);
        System.out.println("静态代码块");
    }
    //代码块
    {
    
    
        System.out.println(field);
        System.out.println("代码块");
    }

    public InitTest() {
    
    
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
    
    
        new InitTest();
    }
}

运行结果:

静态变量
静态代码块
变量
代码块
构造方法

继承关系的类

示例

class HelloB {
    
    

    public HelloB() {
    
    
        System.out.println("B的构造方法");
    }

    {
    
    
        System.out.println("B的构造代码块");
    }

    static {
    
    
        System.out.println("B的静态代码块");
    }
}
class HelloC extends HelloB {
    
    
    public HelloC() {
    
    
        System.out.println("C的构造方法");
    }

    {
    
    
        System.out.println("C的构造代码块");
    }

    static {
    
    
        System.out.println("C的静态代码块");
    }

    public static void main(String[] args) {
    
    
        HelloC helloC = new HelloC();
        System.out.println("**********");
        HelloC helloC1 = new HelloC();
    }
}

运行结果:

B的静态代码块
C的静态代码块
B的构造代码块
B的构造方法
C的构造代码块
C的构造方法
**********
B的构造代码块
B的构造方法
C的构造代码块
C的构造方法

当涉及到继承的时候,顺序如下:
1.执行父类的静态代码块。并初始化父类静态的成员变量
2.执行子类的静态代码块。并初始化子类静态的成员变量
3.执行父类的构造代码块,执行父类的构造方法,并初始化父类的普通的成员变量
4执行子类的构造代码块,执行子类的构造方法,并初始化子类的成员变量

猜你喜欢

转载自blog.csdn.net/xue_yun_xiang/article/details/114590592
今日推荐