Java中对象的生命周期

来源:互联网 发布:新闻投稿知乎 编辑:程序博客网 时间:2024/05/01 02:46

  (1) 对象生命周期的开始

             对象生命周期开始时,需要为对象分配内存(在内存运行时数据区的堆区中为对象分配内存),并且初始化它的实例变量;

           对象生命周期结束

             Java虚拟机的垃圾回收线程回收对象的内存,一般只要Java程序中没有变量引用某个对象,该对象的生命周期结束,因此可以通过控制变量的生命周期来控制对象的生命周期。

 

  (2) 创建一个对象指创建一个类的实例,前提是类被初始化,对象可以被显式或者隐式创建,显式创建对象有以下几种方式

           a. new语句创建对象

           b.利用反射机制,调用java.lang.Class的forName()(得到java.lang.Class对象的实例)和java.lang.reflect.Constructor的newInstance()方法(得到该类的对象的实例)

             

           c.调用对象的clone()方法(clone()方法没有调用构造函数,创建一个复制的对象,属性与原对象完全相同,保存在不同的内存地址中)

           d.运用反序列化方法,调用java.io.ObjectInputStream类的readObject()方法

  (3)使用new或者反射的方法时,会执行类的构造函数,使用对象的clone方法,不会调用构造函数。

  (4)关于clone()

          a. Object类中声明为protected类型,如果Object的子类想对外公开clone()方法,需要扩大访问权限;

          b. 使用clone()方法需要实现Cloneable接口;

          c.调用clone()方法会创建一个复制的对象,这个对象和原来的对象具有不同的内存地址,但是他们的属性值相同;

  (5)隐式地创建对象

          a. java命令的命令行参数

          b. String类型的直接数对应一个String对象

          c. 字符串操作符“+”结果为一个新的String对象

          d. JVM加载类时,创建的Class类型的对象

  (6)创建对象的步骤(不管以何种方式创建对象,步骤都有以下三步)

          a.分配内存

          b.将实例变量初始化为默认值

          c.初始化对象为正确的值

    (7)根据对象创建方式的不同 ,初始化有以下三种方式

          a.clone,直接用源对象的属性初始化新对象的属性值

          b.如果对象的声明语句中显式初始化,则先进性显式初始化,接着再执行构造函数

 

(8)构造方法的定义

         a.方法名与类名相同

         b.没有返回类型

         c.不能够用static(构造函数和实例相关),final(构造函数不能够被继承,因此不能够被重写,定义成final多此一举),synchronized,native(不提倡调用本地方法,否则平台相关),abstract(构造函数不能被覆盖,因此不能够是abstract类型)修饰

(9)构造函数可以重载,可以在一个构造函数中通过this调用另外一个构造函数

(10)this的使用

          a.必须作为第一条语句出现

          b.只能在构造函数中通过this调用其他构造方法,不能够在实例方法中通过this调用构造方法,但是可以通过this调用其他的成员

          c.不能够通过方法名调用构造函数

(11)默认构造方法(定义就是,没有参数的方法叫做默认构造方法)

         a.没有参数的构造方法

         b.有两种,一种是隐式构造方法,有java提供,另外一种是在程序中显式定义默认构造方法,只要没有参数就行了

         c.如果一个类中的所有构造函数都有参数,那么这个类就没有默认构造方法,如果一个类中有显式定义默认构造方法,那么这个类就没有隐式默认构造方法

(12)构造方法不能够被继承(所以不必定义成为final或者abstract类型的)

(13)super

          a.子类的构造方法中,只能够通过super调用父类的构造方法,不能够通过方法名调用;

          b.作为子类构造方法的第一句;

(14)如果父类没有默认构造方法(所有的方法都有参数),子类没有使用super或者super中没有参数,则会出现编译错误

(15)构造方法可以有private,protected,public和默认四种访问级别

(16)关于private的构造方法

          只能够在当前类中访问

          a.当前类中的其他构造方法通过this访问

          b.当前类中的成员方法通过new访问

构造方法能且仅能通过this调用类中的其他构造方法,成员方法能且仅能通过new调用类中的构造方法

(17)何时将构造函数定义为private:

          a.类的所有方法都是静态方法,无需创建类的实例就可以调用静态方法

          b.禁止类被继承,且不允许创建类的实例

(18)private构造方法vsfinal类(创建实例方买呢)

         前者既不允许创建类的实例,又不允许类被继承

         后者可以通过new创建类的实例,但不允许类被继承

()private构造方法vsabstract类

      后者虽本类不能够被实例化,但是可以有实例(但是拥有子类的实例),但是希望通过继承实现类中的抽象方法,而前者不能够被继承

原创粉丝点击