类的生命周期

类初始化

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

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

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

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

对象实例化

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

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

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

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

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

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

摘自https://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/

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

时间: 2025-01-02 05:45:36

类的生命周期的相关文章

java类的生命周期

类的生命周期:加载.连接(验证.准备.解析).初始化.使用.卸载主动引用(有且只有)初始化: 1.new.getstatic.putstatic.invokestatic如果类没初始化,则初始化new关键字实例化对象.读取或设置一个类的静态字段(被final修饰.*已在编译期把结果放入常量池的静态字段除外).调用一个类的静态方法  2.使用java.lang.reflect包的方法对类进行发射调用的时候,如果类没有进行过初始化,则初始化 3.当初始化一个类的时候,父类没初始化,则初始化 4.当虚

Java类的生命周期详解

引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几

【转载】详解java类的生命周期

原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,

类的生命周期(下)类的初始化【转】

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化.在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值.(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化 [html] view plaincopyprint? public

java类的生命周期,从装载,链接,初始化到卸载,关键是何时卸载??

卸载       关于类的卸载,笔者在单例模式讨论篇:单例模式与垃圾回收一文中有过描述,在类使用完之后,如果有下面的情况,类就会被卸载: 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例.加载该类的ClassLoader已经被回收.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法.        如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生

深入java虚拟机(二)——类的生命周期(上)类的加载和连接

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象.实际的情况可能

详解java类的生命周期

最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正.        首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区

深入java虚拟机(三)——类的生命周期(下)类的初始化

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化.在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值.(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化 [html] view plaincopyprint? public

【Android 细节(二)】业务操作类的生命周期中的开始方法

为了防止内存泄露或者其他更重要的原因,为业务操作类构建生命周期是必不可少的. 即在类里封装onStart(),onPause(),onFinish()方法.比如我要写一个Android中处理数据库的业务类,他的特点是所有的数据操作是以key-value的方式存储. Databaser.java: <span style="font-family:Microsoft YaHei;font-size:18px;">// 构造方法 public PhoneDbAdapter(Co

关于类的生命周期

JAVA类的生命周期,java类通过编译为.class文件,是字节码文件,然后放入虚拟机里面. 只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程. (1).关于JVM(java虚拟机): · 方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息.常量.静态变量以及方法代码的内存区域,叫做方法区. · 常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息. · 堆区:用于存放类的对象实例. · 栈区:也叫j