Java的对象初始化过程
成员变量(字段)初始化顺序
在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的。即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调用之前。
若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
static 初始化只有在必要的时候才会进行。如果不创建一个Table 对象,而且永远都不引用Table.b1 或Table.b2,那么static Bowl b1 和b2 永远都不会创建
对象创建过程
- 类型为Dog的一个对象首次创建时,或者Dog类的static字段或static方法首次访问时,Java解释器必须找到Dog.class(在事先设定好的路径里面搜索);
-
找到Dog.class 后(它会创建一个Class 对象),它的所有static 初始化模块都会运行。因此,static 初始化仅发生一次——在Class 对象首次载入的时候;
-
创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个Dog 对象分配足够多的存储空间;
-
这种存储空间会清为零,将Dog 中的所有基本类型(Primitive)设为它们的默认值(0用于数字,以及boolean 和char 的等价设定);
-
进行成员字段定义时发生的所有初始化都会执行;
-
执行构造函数。
static构建从句
class Spoon {
static int i;
static {
i = 47;
}
// . . .
尽管看起来象个方法,但它实际只是一个static关键字,后面跟随一个方法主体。与其他static初始化一样,这段代码仅执行一次——首次生成那个类的一个对象时,或者首次访问属于那个类的一个static 成员时(即便从未生成过那个类的对象)
下面用一个例子来说明 static 静态变量和实例变量的初始化过程:
private static class TestStaticInit { // Class类加载时执行初始化 private static int a = 1; private static int b = 2; // Class类加载时未初始化则使用 primitive 类型的默认值,即 0 private static int c; // TestStaticInit类型实例化时进行初始化 private int d = 3; static { out.println(a); out.println(b); out.println(c); } public TestStaticInit() { out.println(d); } } public static void main(String[] args) throws ClassNotFoundException { // 执行类加载,默认进行类的初始化 Class.forName("Test$TestStaticInit"); new TestStaticInit(); }
输出结果:
a = 1 b = 2 c = 0 d = 3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2015-10-20 通过NameValuePairsValueProvider对象来获取指定前缀的Key