JVM-对象的生命周期

当一个类型经历了装载,连接,初始化之后,就可以为这个类变量实例化一个对象了。在java中,一个类可以被显式或者隐式的实例化。
显式实例化有四种方法:
1 使用new操作符
2 调用java.lang.reflect.Constructor的newInstance方法
3 调用现有对象的clone方法
4 通过java.io.ObjectInputStream的readObject方法反序列化

隐式实例化就是指在代码中看不见以上四种关键字,但仍会在堆空间中实例化对象,比如public static void main(String [] args)方法中的参数,当有参数传入的时候,就需要实例化String对象,这就是隐式实例化;再比如System.out.println("str"+"str1");语句会实例化出一个StringBuffer对象和一个String对象,StringBuffer对象用于连接两个常量,String用于存储StringBuffer.toString()的结果。这些都是隐式的创建类对象。

不管是显式的还是隐式的,当 实例化一个类对象的时候,JVM会在堆空间中为对象变量分配内存,包括他的父类中的对象变量。同时为这些对象变量赋默认值(这和类的连接阶段的准备过程很像)(如果变量在声明的时候有默认值那就赋代码中的默认值)。当为对象变量分配内存并赋默认值之后,就开始为变量赋正确的值了(这和类的初始化阶段很想)。对于使用clone方法产生的对象,直接从被克隆的对象中复制值。对于使用readObject产生的对象,直接从输入流中读取值。 对于使用new产生的对象,调用类的构造方法,类的构造方法在类的class文件中叫<init>方法。编译器在编译生成class文件的时候会保证每个类至少有一个<init>方法,这与类<clinit>方法略有不同。<clinit>方法是否存在主要取决于类中是否有类对象初始化语句和静态初始化语句。<init>方法负责为类的实例对象赋正确的值。关于<init>方法,使用过构造函数的都应该知道,在此不再赘述。

当一个类实例化产生对象之后,就可以使用这个对象了。当这个对象不再被使用的时候吗,就需要对象的垃圾回收机制了。关于垃圾回收,以后的博文中介绍。




猜你喜欢

转载自yizhenn.iteye.com/blog/2290683