9.2 构造器与垃圾收集器

本文探讨了构造函数在面向对象编程中的角色,特别是当涉及到继承时的行为。文章详细介绍了构造函数如何初始化子类对象,super关键字的使用,以及构造函数调用的顺序。此外,还讨论了对象生命周期和垃圾回收的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

回顾

每个对象不只是保存自行声明的变量,还有从父类继承来的东西(至少带有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代表“空”的字节组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值