java程序试岗内容_java程序员修炼之路基础篇四:继承

上一篇文章我跟大家聊了一下"封装",今天我们聊一下同样作为java语言三大特征之一的"继承"。

简单说"继承"就是从一个已知类派生出新类的过程,"继承"既体现了对已有类的功能复用又强调了发展的概念。下面我们从这两个方面分别进行阐述,先说"继承"本身都继承了哪些父类的内容,我们看一个实例。

ac10dc88338306377317c170f29f5107.png

这是一个非常简单的关于"继承"的描述,子类BMW通过继承Car类拥有了paint方法。通过这个例子我们看到了,作为子类能够继承父类的功能,体现了"继承"在代码"复用"上的价值,同样,成员属性也是能够继承的。但是并不是所有的功能和属性子类都能继承,如果父类中把功能限定为"私有"的范围限定,则子类是无法进行继承的,这是对"封装"的尊重。

除了普通功能,作为类初始化重要成员的"构造器"是否能被子类继承呢?答案是否定的,子类只能调用父类的构造器,不能继承它,我们看一个实例。

e9a1b5a7d83af91d2ab69868e271e131.png

本例BMW的"构造器"通过super完成了对父类Car"构造器"的调用。虽然例子演示了如何完成"构造器"的调用,但是还有一些内容需要额外强调一下。第一,如果子类没有显示调用父类的"构造器",则子类会默认调用父类中无参的"构造器",如果父类中没有无参"构造器",子类的默认调用会导致报错。第二,super在子类的"构造器"中一定是第一句话,因为只有在完成父类的初始化之后,才能继续子类的初始化。第三,建议大家在编写程序时为每个类都写一个无参的构造器,这将是一个很好的编程习惯,同时子类的super要显示调用,尽量不用默认的super调用。

如果一个子类只是继承了父类的内容,没有任何"发展",那么这个继承本身是没有价值的。"发展"体现在哪些方面呢?主要体现在增加功能和改变已有功能两个方面上。增加功能无非就是在子类中定义新的功能方法,那么改变则体现在一个新的概念上,这个概念叫做"方法重写",我们看一个实例。

f40bbe44f23e90cc9b2f07c26c1c620d.png

例子中子类BMW重新定义了paint方法,以便于适合子类的功能要求,这就是"方法重写",也描述了修改已有功能的含义。

"方法重写"也有叫"方法覆盖"的,在规则上总结一下,有一个"前提"三个"相同"两个"规定"。"前提"是在继承体系结构下,三个"相同"分别是名字相同、参数列表相同和返回值类型相同,两个"规定"分别是方法的范围限定不能小于重写前,同时不能抛出更多的"异常"(后续文章中描述)。在名字和参数列表都相同的情况下,如果返回值类型不相同,那么系统会报错。

在实例中我们还看到了super的另一个用法,就是调用已经被重写的父类方法。除了能用super调用被子类重写的方法,super还能调用被子类隐藏的属性,所谓"隐藏"属性,就是在子类中定义了跟父类一样的属性,方法也存在"隐藏",我将在关于"多态"的文章中跟大家探讨。

另外需要补充说明的就是java语言本身是"单继承"体系结构,简单说就是一次只能继承一个其他的类,或者说只能有一个直接父类。所有的java类均继承或间接继承自Object类,我们在上一篇文章中提到的toString方法就是定义在Object类中的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值