JAVA 接触也有一阵子了,又要开始IOS 上的单测,OC 和JAVA 中对static 关键字的处理逻辑基本一致,因此,再次理解了static 关键字的原理。
首先,你可能已经知道,static 的方法有以下几点特征:
- 不能直接引用非static 变量
- 只会在内存中创建一次,可以被重复调用
- 被所有对象共享
- 直接被类名调用
但是,这篇文章不想只告诉这些条条文文,而要让我们知道背后的一些原因。
Java 程序运行的过程
Java 程序运行时,有下面三个过程:
-
加载
可以理解为将.java 文件动态编译为.class ,然后将.class 文件中的二进制数据读入内存的过程。加载的最终产物是位于 堆 中class 对象。 -
连接
主要是将已经读到内存的类的二进制数据合并到虚拟机的 运行时 环境中去。 -
初始化
在这个阶段主要执行类的构造方法,比如new 一个实例化对象。首先,static 的成员是在类加载的时候完成初始化的,而 非static 成员在那之后的初始化阶段完成初始化。
那么,在加载的时候,非static 还没有完成加载,则必然不能访问。这就解释了为什么static 成员不能访问 非static 成员。因为初始化的时序有先后。
那 static 成员如何才能访问 非static 成员呢?
static 成员访问 非static 成员
从上面的理解可以知道,只有当 非static 成员完成初始化之后才能被分配内存空间,这之后才能去访问 static 成员。
访问方式:
public class 类名{
public int ddlxz;
public static func(){
new 类名().ddlxz;
}
}