从Java程序的运行理解继承

 

目录

基本代码

代码执行

new的执行

extends关键字 

构造方法

super()方法

 内存的分配

?private属性的继承


基本代码


public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat() ;
    }
}

class Animal {
    private int age;
    private String name;

    public Animal() {

    }

    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }

}

class Cat extends Animal {
    
}



​

代码执行

new的执行

之前我们有提到过,new执行时先要在堆中为对象开辟一块内存空间,随后执行以下步骤:

  1. 设置this
  2. 为对象属性赋默认值
  3. 为对象赋初值(按编程者的意愿)
  4. 返回this

但是现在咱们有一个问题,开辟内存空间前,我们需要知道该对象需要多少的内存空间,可我们现在new出的是一个Cat对象,如你所见,Cat类里啥也没有,那我们如何去确定其所占的内存空间呢?

extends关键字 

我们注意到,在Cat类名后出现了extends关键字,我们用extends关键字来表示继承关系,例如代码中的Cat和Animal就是继承关系,即Animal是Cat的父类。Cat类里啥也没有,但Cat的父类里写有两个属性,我们想想内存空间的确定会不会和其父类Animal有关系。

继承的英文单词是Inherit而不是Extends,那为什么Java的开发者们要用extends关键字呢?其实,在子类中,我们常常重写父类的方法,使之实现更加具体合理,或是添加父类没有的方法,让子类具有更多功能,你会发现,这就是一种子类对父类的拓展(extends),这也体现了Java开发者的才思。

构造方法

注意到,代码中有一类方法很有特点:

//无参构造
public Animal() {

}

//有参构造
public Animal(int age, String name) {
    this.age = age;
    this.name = name;
}



​

它们没有返回值类型,这样的方法被称为构造方法(Construction method)构造方法为对象中的属性变量赋初值,在你创建一个类却没有写构造方法时,Java将默认赠送一个无参构造,但要注意的是,一旦写了有参构造,默认的无参构造将不复存在,而一些秘密,就藏在构造方法里。

super()方法

虽然没写出,但其实在每个无参构造方法中,都有一个super()方法,该方法会调用直接父类的构造方法,使得子类能够继承父类的特性,对于该方法需要注意的是:

  • 在构造子类对象时,首先构造父类的特征,也就是说,如果要在构造方法中写出super()方法(当然,一般不这么做)super()方法必须写在第一句
  • 除Object类(超级父类)外,所有的类都应当具有super()方法
  • 如果不存在无参构造(即上述写了有参构造却不补无参构造的情况)则构造时的super()方法不存在,这会引发意想不到的后果。例如子类无法被构造。

 内存的分配

到这儿,开始的问题已经可以基本说清,子类Cat通过无参构造中的super()方法,调用了父类Animal的构造方法,从而隐式继承了Animal的两个属性,有了这两个属性,对象cat所需的内存空间也能被确定下来。

?private属性的继承

可是这里有一个问题,我们说,在父类中,private的方法不能被子类所继承,难道private的属性就可以么?翻阅一些参考书,许多人认为是不能的,但我认为它就是一种隐式继承,只不过我们说,父类中public的方法被子类继承叫做“拿来就用”,但子类对父类private属性的继承可以理解为继承其特性,例如我继承了父母的双眼皮,这不是把父母的双眼皮“直接拿来用”,而是继承了这一特性罢了。

新人创作,水平有限,如有错误,敬请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eternal*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值