Java代码块详解【静态代码块、构造代码块】

何为代码块

在Java中用{ }括起来的的代码被称为代码块。

根据其位置和声明的不同,可以分为:局部代码块、构造代码块、静态代码块。

1、局部代码块:在局部位置,用于限定变量的生命周期,提高内存利用率。
就是平时用到的{ },例如:

class Arrays {

}

限定变量的生命周期:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 34, 56, 43};

        //代码块
        {
            int a = 10;
            System.out.println(a);
        }

        //这里会报错,因为变量a的生命周期已经结束
        System.out.println(a);
    }
}

2、构造代码块:在类中的成员位置,用{ }括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。
  作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。


public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 34, 56, 43};
        //创建一个对象a
        Arrays a = new Arrays();

        //调用方法
        a.printArray(arr);

        //创建一个对象b
        Arrays b = new Arrays();
    }
}

class Arrays {
    //构造代码块
    {
        System.out.println(123);
    }

    //构造方法
    public Arrays() {
        System.out.println("构造函数在这时执行");
    }

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

    //printArray方法
    public void printArray(int[] arr) {
        for(int i = 0; i < arr.length-1; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println(arr[arr.length-1]);
    }

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

上面这段代码的执行结果是:

123
456
789
构造函数在这时执行
1 34 56 43
123
456
789
构造函数在这时执行

从以上结果可以看出,每创建一个对象构造代码块都会执行一次,并且都是在构造方法执行之前执行的。也就是说构造代码块的执行顺序与它放的位置无关(当然,构造代码块之间的执行顺序跟它写的顺序有关)

3、静态代码块:在类中的成员位置,用{ }括起来的代码。用static修饰。
  作用:对类进行初始化。


public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 34, 56, 43};
        Arrays a = new Arrays();
        a.printArray(arr);
        Arrays b = new Arrays();
    }
}

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

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

    //构造方法
    public Arrays() {
        System.out.println("构造函数在这时执行");
    }

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

    public void printArray(int[] arr) {
        for(int i = 0; i < arr.length-1; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println(arr[arr.length-1]);
    }

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

}

上面代码执行结果:

静态代码块1
静态代码块2
静态代码块3
123
构造函数在这时执行
1 34 56 43
123
构造函数在这时执行

从执行结果来看,不论静态代码块是在构造代码块前边,还是在构造方法后边或者是在类的最下边都是第一个执行的,也就是说静态代码块的执行顺序与它放的位置无关(当然,静态代码块之间的执行顺序跟它写的顺序有关)。而且最重要的是不论创建几个对象,静态代码块都只在第一次创建时执行一次。也就是说,静态代码块只在类被编译时执行一次。
 

4、同步代码块:

猜你喜欢

转载自blog.csdn.net/k_young1997/article/details/81148652