博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类的生命周期
阅读量:5173 次
发布时间:2019-06-13

本文共 1006 字,大约阅读时间需要 3 分钟。

 

类初始化

类"初始化"阶段,它是一个类或接口被首次使用的前阶段中的最后一项工作,本阶段负责为类变量赋予正确的初始值。

Java 编译器把所有的类变量初始化语句和类型的静态初始化器通通收集到 <clinit> 方法内,该方法只能被 Jvm 调用,专门承担初始化工作。

除接口以外,初始化一个类之前必须保证其直接超类已被初始化,并且该初始化过程是由 Jvm 保证线程安全的。另外,并非所有的类都会拥有一个 <clinit>() 方法,在以下条件中该类不会拥有 <clinit>() 方法:

  • 该类既没有声明任何类变量,也没有静态初始化语句;
  • 该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;
  • 该类仅包含静态 final 变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式。

 

对象实例化

在类被装载、连接和初始化,这个类就随时都可能使用了。对象实例化和初始化是就是对象生命的起始阶段的活动,在这里我们主要讨论对象的初始化工作的相关特点。

Java 编译器在编译每个类时都会为该类至少生成一个实例初始化方法--即 "<init>()" 方法。此方法与源代码中的每个构造方法相对应,如果类没有明确地声明任何构造方法,编译器则为该类生成一个默认的无参构造方法,这个默认的构造器仅仅调用父类的无参构造器,与此同时也会生成一个与默认构造方法对应的 "<init>()" 方法.

通常来说,<init>() 方法内包括的代码内容大概为:调用另一个 <init>() 方法;对实例变量初始化;与其对应的构造方法内的代码。

如果构造方法是明确地从调用同一个类中的另一个构造方法开始,那它对应的 <init>() 方法体内包括的内容为:一个对本类的 <init>() 方法的调用;对应用构造方法内的所有字节码。

如果构造方法不是通过调用自身类的其它构造方法开始,并且该对象不是 Object 对象,那 <init>() 法内则包括的内容为:一个对父类 <init>() 方法的调用;对实例变量初始化方法的字节码;最后是对应构造子的方法体字节码。

如果这个类是 Object,那么它的 <init>() 方法则不包括对父类 <init>() 方法的调用。

 

摘自

《解析 Java 类和对象的初始化过程》

转载于:https://www.cnblogs.com/gdjdsjh/p/5111481.html

你可能感兴趣的文章
每天一个 linux命令(35):ln 命令(转载)
查看>>
JavaSE习题 第九章 输入输出流
查看>>
Android 系统属性
查看>>
Java 8 Stream介绍及使用2
查看>>
摘录自《Vivian Lee》
查看>>
4-windows 用cmd 如何输入命令 进入文件夹
查看>>
毕业后的五年拉开大家差距的原因(肖雪)
查看>>
Java集合大全
查看>>
接口限流算法
查看>>
HDU - 2845 Beans
查看>>
html设置背景图片并自适应
查看>>
深入研究C语言 第一篇(续)
查看>>
数字 字符串 转换
查看>>
Git时光机穿梭之撤销修改
查看>>
雷林鹏分享:MySQL 插入数据
查看>>
C#设计模式之抽象工厂
查看>>
NOSQL
查看>>
Oracle存储过程由例子到理论
查看>>
正因为我们是前端,所以代码更需要优雅
查看>>
实验四 主存空间的分配和回收
查看>>