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