Java中静态代码块和类加载的理解

静态代码块

经过学习我们知道,静态代码块是在类加载的时候执行的,那么问题就出来了,什么时候类才加载呢?其实类加载是有时机的,当同一个类加载时机多次出现时,JVM会确保每个类都只加载一次,从而静态代码块也只执行一次。

类加载的时机如下:

  • 创建对象实例时
  • 访问类的静态成员时(属性或方法)
  • 初始化一个类的子类(会首先初始化子类的父类)
  • JVM启动时,带有main方法的那个类
  • 反射机制

创建对象实例

public class Demo01 {
    public static void main(String[] args) {
        new A();//1
        new A();//2
    }
}

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

在这里插入图片描述

以上代码运行后,可以看到语句只执行了一次,可以证明创建对象可以使类加载,而且多次创建同一个类的对象,也只能使该类加载一次。

注:使用 new 进行类加载时,静态代码块 要比 构造方法 先执行

访问类的静态成员

public class Demo02 {
    public static void main(String[] args) {

        A.fun();
        A.fun();

    }
}

class A{


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

    public static void fun(){}
}

在这里插入图片描述
运行后,同理,结果如上面的一样。

初始化一个类的子类

public class Demo03{
    public static void main(String[] args) {

        new B();

    }
}

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


}

class B extends A{
  static{
        System.out.println("我是静态代码块B");
    }
}

在这里插入图片描述

运行后,new B()时,首先调用了A的构造方法,所以 道理是一样,结果是显然的。
JVM启动带有main方法的类

public class Demo01 {
    static {
        System.out.println("我是带有main类中的静态代码块");
    }
    public static void main(String[] args) {

    }
}

在这里插入图片描述
运行后,结果也不出所料。

总结:了解静态代码块,可以加深我们对JVM类加载的理解,让我们可以根据不同时机,静态代码块可以帮助我们在类加载时初始化一些常量之类的,便于写出符合我们需求的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值