JAVA规范学习——static成员初始化

本文探讨了Java中类和接口的初始化过程,包括类变量如何触发初始化,以及接口字段引用时的不同行为。通过具体示例解释了子类并不会因为父类的静态变量而初始化,以及接口初始化时不会导致其超接口的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出:1729

 

知识要点:

A reference to a class field causes initialization of only the class or interface
that actually declares it, even though it might be referred to through the name of a
subclass, a subinterface, or a class that implements an interface.

也就是说只有使用该类或者接口直接定义的类变量,才会激发该类的初始化;如果使用的是其父类定义的类变量,则子类不会被初始化

 

输出:

1
j=3
jj=4
3

 知识要点:

Initialization of an interface does not, of itself, cause initialization of any of its
superinterfaces.

The reference to J.i is to a field that is a compile-time constant; therefore, it
does not cause I to be initialized. The reference to K.j is a reference to a field
actually declared in interface J that is not a compile-time constant; this causes initialization
of the fields of interface J, but not those of its superinterface I, nor
those of interface K. Despite the fact that the name K is used to refer to field j of
interface J, interface K is not initialized.

### Java 中 `static` 关键字的初始化过程 在 Java 中,`static` 是用于声明属于类而非特定对象的字段、方法或代码块的关键字。以下是关于 `static` 的初始化过程及其使用的详细介绍: #### 静态变量和静态代码块的加载顺序 当 JVM 加载一个类时,会按照以下顺序处理该类中的静态部分: 1. **静态变量的初始化** 静态变量会在类被加载时按其在源码中出现的顺序依次初始化[^1]。 2. **静态代码块的执行** 执行所有的静态代码块,同样遵循它们在源码中定义的顺序[^2]。 这些操作只发生一次,即第一次使用该类时触发(例如通过创建实例或者访问静态成员)。一旦类被加载并完成了静态初始化,后续对该类的操作不会再次触发这一过程。 #### 示例分析 考虑下面的例子来理解具体的流程: ```java public class StaticInitExample { static int x = getValue(); static { System.out.println("Static block executed"); } public static int getValue() { System.out.println("getValue method called"); return 42; } } ``` 运行此程序的结果将是先输出 `"getValue method called"` ,接着才是 `"Static block executed"` 。这表明即使存在显式的赋值逻辑,JVM也会优先依据书写次序完成所有必要的准备工作后再进入下一个阶段[^3]。 #### 解决可能遇到的问题——重复初始化情况下的应对策略 有时开发者可能会面临某些特殊场景下需要重新设置某个已经存在的静态属性的情况。虽然理论上讲,除非卸载再重载整个 ClassLoader 否则无法做到真正的“重新”初始化;不过可以通过设计模式规避此类需求,比如采用单例模式控制资源获取时机等手段间接达成目的[^3]。 另外值得注意的是,在涉及继承关系的情况下,父类的所有静态组件都会早于任何子类相关内容得到处置[^5]。这意味着如果尝试从派生类别处引用超类型里的东西,则需确保前者已被适当安排好才能正常运作。 ### 使用建议 为了使应用程序更加健壮可靠,在运用 `static` 进行开发期间应当注意几点事项: - 尽量减少对外暴露可变状态的机会; - 对共享数据结构采取同步措施防止并发冲突; - 明确区分哪些行为应该关联至具体实体之上而不是全局范围内适用的功能模块里去实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值