Java中static块实施时机版权声明

原创
小哥 3年前 (2022-10-27) 阅读数 51 #大杂烩

演示例子
在使用static不能进行初始化操作!代码如下:

public class StaticDemo {

public static final String INIT = "init";
static {
System.out.println("------StaticDemo----");
}
}

public class TestStatic {

public static void main(String[] args) {
System.out.println(StaticDemo.INIT);
}
}
//打印
init

为什么不实施呢? static 那街区的代码呢?

最后,发现该调用的静态属性为final由修改引起的。移除final修改,结果OK!

public class StaticDemo {

//去掉 final
public static String INIT = "init";
static {
System.out.println("------StaticDemo----");
}
}

public class TestStatic {

public static void main(String[] args) {
System.out.println(StaticDemo.INIT);
}
}
//打印结果
------StaticDemo----
init

下面是类加载机制。 初始化 相关!==加载类时,不一定执行静态代码块。静态代码只有在类被活跃使用时才会执行!==

当一个类被活跃使用时,Java虚拟将对其进行初始化,并且以下六种情况处于活动状态:

在创建类的新实例时(如通过。new或反思、克隆、反序列化等)
当调用类的静态方法时
为类或接口使用静态字段时
当调用Java API中的一些反射方法,如类。Class方法,或java.lang.reflect中的类的方法
在初始化子类时
当虚拟机启动标记为启动类的类时(即,包含main该方法的类)

Java编译器收集类型的所有类变量初始化语句和静态初始化式,并将它们放入一个特殊的方法中:clinit。
————————————————
版权声明:本文是CSDN博主阿飞云的原文如下 CC 4.0 BY-SA 版权协议,转载请附上原始来源链接和本声明。
原始链接:https://blog.csdn.net/u010648555/article/details/82228244

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门