9.2 构造器与垃圾收集器

来源:互联网 发布:python中的sleep 编辑:程序博客网 时间:2024/06/05 14:20

前言

上节提到构造函数,若是涉及到父类呢?本章将对此问题进行论述。

回顾

每个对象不只是保存自行声明的变量,还有从父类继承来的东西(至少带有Object类)。

构造函数的运行过程

对象在创建时,对象会取得的所有实例变量所需的空间,包括继承的东西,若父类有setter方法调用私有变量(私有本来不继承),则此变量也有空间。对象带有setter所包装的实例变量,这些实例变量是子类被初始化时创建的(不算真正的对象,但因为它们有被包装过,所以我们不在乎)

在创建对象时,所有继承的构造函数都会执行,即每个构造函数都会在子类对象创建时期执行,启动构造函数链,先子类,自下而上,一直到Object类,但是执行过程则是从上而下,类比小孩不能再父母之前出生。值得注意的是子类会根据父类的实例变量来继承方法。完整的对象需要也是完整的父类核心。

super关键字

调用父类的构造函数的唯一方法是调用super();

public class Duck extends Animal{ int size; public Duck(int newSize){     super();     size=newSize;     }}
若没有super();则编译器会自动加,且加的调用必为没有参数的父类构造函数版本。

整个过程就是先全部进栈(调用),一直到Object类,再依次执行(完成)。

父类的部分必须在子类创建完成之前就完整地成形,即父类的构造函数必须在子类的构造函数之前结束。

对super()的调用必须是构造函数的第一个语句。

public Boop(int i){   size=i;   super();  //错误,不是第一个语句}
若父类的构造函数有参数,则需通过super(参数);来调用父类带参数的构造函数。

从某个构造函数调用重载版的另一个构造函数

基本思想是所有构造函数先调用该构造函数,让它执行真正的构造函数,避免让相同的代码重复出现。

this关键字

this()是对对象本身的引用。

this()只能用在构造函数中,且为第一行语句。

this()与super()不可兼得。

使用this()来从某个构造函数调用同一个类的另外一个构造函数。

生命周期

1.对象的生命周期看引用变量的生命周期。

2.实例变量的寿命与对象相同。

3.局部变量只存活在声明该变量的方法中,作用域仅限于该方法中,不包括该方法调用的其他方法中,该方法执行结束(包含中间调用其他方法的结束),局部变量死亡。

4.引用变量只能在处于其范围中才能被引用,即除非引用变量在范围内,不然就不能通过该引用变量使用被引用的对象。

5.对象用完就要抛弃(让该对象的所有引用死亡,已经不能取得对象了),给GC自动回收内存

对象的释放

释放对象引用的三种方法

void go(){Life z=new Life(); //法一:方法结束后,引用变量永久性的离开范围}Life z=new Life();z=new Life();   //法二:引用赋值到其他对象Life z=new Life();z=null;            //法三:引用设定为null

书海拾荒

1.构造函数可以是公有的,私有的或不指定的。

2.私有的构造函数代表除了该类外不可存取。

3.每个类(包括抽象类)至少有一个构造函数。

4.null代表“空”的字节组合

原创粉丝点击