阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Java 对象初始化的过程介绍

283次阅读
没有评论

共计 2695 个字符,预计需要花费 7 分钟才能阅读完成。

导读 在 Java 中,一个对象在可以被使用之前必须要被正确地初始化,这一点是 Java 规范规定的。在实例化一个对象时,JVM 首先会检查相关类型是否已经加载并初始化,如果没有,则 JVM 立即进行加载并调用类构造器完成类的初始化。

Java 对象初始化的过程介绍

一个类及其对象初始化的过程
什么时候需要初始化一个类

首次创建某个对象时:

Dog dog = new Dog();

首次访问某个类的静态方法或者静态字段时:

Dog.staticFields;

Java 解释器就会去找类的路径,定位已经编译好的 Dog.class 文件。

获得类的资源

然后 jvm 就会载入 Dog.class,生成一个 class 对象。这个时候如果有静态的方法或者变量,静态初始化动作都会被执行。这个时候要注意啦,静态初始化在程序运行过程中只会在 Class 对象首次加载的时候运行一次。这些资源都会放在 jvm 的方法区。

方法区又叫静态区,跟堆一样,被所有的线程共享。

方法区中包含的都是在整个程序中永远唯一的元素,包含所有的 class 和 static 变量。

初始化对象 Dog dog = new Dog()

  1. 第一次创建 Dog 对象先执行上面的一二步
  2. 在堆上为 Dog 对象分配足够的存储空间,所有属性和方法都被设置成默认值 (数字为 0,字符为 null,布尔为 false,而所有引用被设置成 null)
  3. 执行构造函数检查是否有父类,如果有父类会先调用父类的构造函数,这里假设 Dog 没有父类,执行默认值字段的赋值即方法的初始化动作。
  4. 执行构造函数。
有父类情况下的初始化

假设: Dog extends Animal

1. 执行第一步,找出 Dog.class 文件,接着在加载过程中发现他有一个基类 (通过 extends 关键字),于是先执行 Animal 类的第一二步,加载其静态变量和方法,加载结束之后再加载子类 Dog 的静态变量和方法。
如果 Animal 类还有父类就以此类推,最终的基类叫做根基类。
注意:因为子类的 static 初始化可能会依赖于父类的静态资源,所以要先加载父类的静态资源。

2. 接着要 new Dog 对象,先为 Dog 对象分配存储空间 -> 到 Dog 的构造函数 -> 创建默认的属性。这里其构造函数里面的第一行有个隐含的 super(),即父类构造函数,所以这时会跳转到父类 Animal 的构造函数。

Java 会帮我们完成构造函数的补充,Dog 实际隐式的构造函数如下:

Dog() { 
    // 创建默认的属性和方法 
    // 调用父类的构造函数 super()(可显式写出)// 对默认属性和方法分别进行赋值和初始化 
}

3、父类 Animal 执行构造函数前也是分配存储空间 -> 到其构造函数 -> 创建默认的属性 -> 发现挖槽我已经没有父类了,这个时候就给它的默认的属性赋值和方法的初始化。

4、接着执行构造函数余下的部分,结束后跳转到子类 Dog 的构造函数。

5、子类 Dog 对默认属性和方法分别进行赋值和初始化,接着完成构造函数接下来的部分。

一、为什么要执行父类 Animal 的构造方法才继续子类 Dog 的属性及方法赋值?

因为子类 Dog 的非静态变量和方法的初始化有可能使用到其父类 Animal 的属性或方法,所以子类构造默认的属性和方法之后不应该进行赋值,而要跳转到父类的构造方法完成父类对象的构造之后,才来对自己的属性和方法进行初始化。

这也是为什么子类的构造函数显示调用父类构造函数 super() 时要强制写在第一行的原因,程序需要跳转到父类构造函数完成父类对象的构造后才能执行子类构造函数的余下部分。

二、为什么对属性和方法初始化之后再执行构造函数其他的部分?

因为构造函数中的显式部分有可能使用到对象的属性和方法。

Tips:其实这种初始化过程都是为了保证后面资源初始化用到的东西前面的已经初始化完毕了。很厉害,膜拜 Java 的父亲们。

说了这么多还是来个例子吧。

这里注意 main 函数也是一个静态资源,执行 Dog 类的 main 函数就是调用 Dog 的静态资源。

实例

// 父类 Animal
class Animal {  
/*8、执行初始化 */  
    private int i = 9;  
    protected int j;  
 
/*7、调用构造方法,创建默认属性和方法,完成后发现自己没有父类 */  
    public Animal() {  
/*9、执行构造方法剩下的内容,结束后回到子类构造函数中 */  
        System.out.println("i =" + i + ", j =" + j);  
        j = 39;  
     }  
 
/*2、初始化根基类的静态对象和静态方法 */  
    private static int x1 = print("static Animal.x1 initialized");  
    static int print(String s) {System.out.println(s);  
        return 47;  
    }  
}  
 
// 子类 Dog
public class Dog extends Animal {  
/*10、初始化默认的属性和方法 */ 
    private int k = print("Dog.k initialized");  
 
/*6、开始创建对象,即分配存储空间 -> 创建默认的属性和方法。* 遇到隐式或者显式写出的 super() 跳转到父类 Animal 的构造函数。* super() 要写在构造函数第一行 */  
    public Dog() { 
/*11、初始化结束执行剩下的语句 */
        System.out.println("k =" + k);  
        System.out.println("j =" + j);  
    }  
 
/*3、初始化子类的静态对象静态方法,当然 mian 函数也是静态方法 */  
    private static int x2 = print("static Dog.x2 initialized");
 
/*1、要执行静态 main,首先要加载 Dog.class 文件,加载过程中发现有父类 Animal,* 所以也要加载 Animal.class 文件,直至找到根基类,这里就是 Animal*/       
    public static void main(String[] args) {  
 
/*4、前面步骤完成后执行 main 方法,输出语句 */ 
        System.out.println("Dog constructor"); 
/*5、遇到 new Dog(),调用 Dog 对象的构造函数 */  
        Dog dog = new Dog();   
/*12、运行 main 函数余下的部分程序 */            
        System.out.println("Main Left"); 
    }  
}

测试输出结果为:

static Animal.x1 initialized
static Dog.x2 initialized
Dog constructor
i = 9, j = 0
Dog.k initialized
k = 47
j = 39
Main Left

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2695字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7807012
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
在Windows系统中通过VMware安装苹果macOS15

在Windows系统中通过VMware安装苹果macOS15

在 Windows 系统中通过 VMware 安装苹果 macOS15 许多开发者和爱好者希望在 Window...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...