Java中的静态代码块与代码块详解

24 篇文章 1 订阅

1 构造代码块

构造代码块就是在类中用{}括起来的代码块,如下所示,普通代码块按照顺序从上到下依次执行。

public class Test{
	{
		//这是构造代码块
	}
}

2 静态代码块

静态代码块就是使用static修饰的用{}括起来的代码段,如下所示,静态代码块用于给静态变量进行赋值,
且:静态代码块在类加载时执行,而且静态代码块只能给静态变量赋值,不能给成员变量赋值。

static{
	//这里是静态代码块,
	//静态代码块中的代码会优先于
}

静态代码块在类加载时执行

public class Test{
    static int n1;
    int n2;
    int n3;

    {
        n2=200;
        System.out.println("普通代码块,n2="+n2);
    }
    {
        n3=300;
        System.out.println("普通代码块,n3="+n3);
    }
    static {
        n1=100;
        System.out.println("静态代码块,n1="+n1);
    }
    public static void main(String[] args) {
        System.out.println("创建第一个实例");
        Test test = new Test();
        System.out.println("n1="+n1);
        System.out.println("n2="+test.n2);
        System.out.println("n3="+test.n3);
        System.out.println("创建第二个实例");
        Test test2 = new Test();
    }

}

在这里插入图片描述
从运行结果可以看出,静态代码块真的只在类加载时执行,之后就不在执行了,且静态代码块的执行顺序要优于普通代码块。

3 构造函数

构造函数是类进行初始化的一个函数,其名字和类名相同且必须相同,构造函数可以不用显示声明,如果没有显示声明,则Java会执行默认的构造函数,构造函数的执行顺序在构造代码块之后,构造代码块是用来给类的非静态属性或变量进行初始化的。

4 三者的顺序对比

4.1 例子1

public class Test {

    public Test() {
        System.out.println("这是构造函数");
    }
    {
        System.out.println("这是构造代码块");
    }
    static {
        System.out.println("这是静态代码块");
    }

    public static void main(String[] args) {

    }
}

在这里插入图片描述

4.2 例子2

public class Test {

    public Test() {
        System.out.println("这是构造函数");
    }
    {
        System.out.println("这是构造代码块");
    }
    static {
        System.out.println("这是静态代码块");
    }

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

在这里插入图片描述

4.3 例子3(继承)

在类与类的继承关系中,父类的静态代码块最先执行,然后再是子类的静态代码块执行,之后便是父类的构造代码块和构造函数,最后才是子类的构造代码块和构造函数执行。

public class Test {

    public Test() {
        System.out.println("Test这是构造函数");
    }
    {
        System.out.println("Test这是构造代码块");
    }
    static {
        System.out.println("Test这是静态代码块");
    }
}
public class Test2 extends Test{
    public Test2() {
        System.out.println("Test2这是构造函数");
    }
    {
        System.out.println("Test2这是构造代码块");
    }
    static {
        System.out.println("Test2这是静态代码块");
    }

    public static void main(String[] args) {
        Test2 test2 = new Test2();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值