(8)2017.8.8-面向对象(3)

来源:互联网 发布:淘宝联盟推广 编辑:程序博客网 时间:2024/05/17 03:39

之前说了面向对象的三大特性是封装,继承和多态,下面就是关于继承的常见的概念以及问题。

继承简单来说就是 is a的关系,及子类包含于父类,举个例子,就是学生是人类的子类,麻雀是鸟类的子类。

父类:又叫超类,基类

子类:又叫派生类

那么为什么要有继承呢,继承的好处就是提高代码复用性,使类之间产生关系,为多态提供可能。 

而父类是不断抽取相同内容而创建出来的。 

java和c++在继承中不同的地方是java不直接支持多继承,那么问题来了,为什么不支持多继承呢?

我翻阅了资料也去查询过,看到了许多大牛对此的观点,发现了现在这个问题涉及了很多方面,首先让我们来多重继承举个例子:

我们定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。那么当我们调用“叫”这个方法时,

它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。

而java对此的解决方法是,一个物体的本质只能有一个。一个动物只能是狗或只能是猫,如果你想创造一个会玩毛线球会玩激光(被激光玩?)的狗,那么只需要创造一个描述这类行为的接口(就叫玩耍吧),然后在自己的类里面实现“玩耍”接口,具体实现这些玩的行为,最终你同样会得到一个既像狗又像猫的动物。如果你想让这个动物叫起来像猫而不是狗,那么使用覆写(override)机制,子类里重新定义“叫”这个行为即可。但是无论如何,这样得到的类是绝对不会有多重继承的冲突的。

多继承是一种极少使用还非常容易产生混淆的语言特性,在极少数需要使用的场景下,还可以通过设计来绕过(就像一个既是狗又是猫的动物,Java中一般是把叫声作为一个接口)。所以为了维护语言的简单易用,Java设计之初就摒弃了这种特性。

但是现在又有所不同了,从Java 8开始,接口允许为方法提供“默认实现”了——默认方法(default method)。因而实质上Java 8的接口多继承其实也会涉及到实现多继承,并且语言层面有专门规定去解决实现多继承时选择哪个版本的问题——哪个都不选择,而是在发现会继承多个默认方法实现并且没有override时报错,逼使用户显式override可能冲突的方法。这使得Java 8开始接口可以当作traits来使用,达到实现多继承的目的。--本段转自知乎大牛RednaxelaFX

但是,java支持多层继承,及父类继承子类,子类还可以继承子类,此时的父类是祖类,一个父类可以有多个子类。

父类中的private方法不能被继承。

方法重写:
1. 发生在父类和子类之间,子类中出现了与父类重名的方法
2. 方法名相同,参数列表相同,返回值相同
3. 方法体不同
4. 访问控制权限不能严于父类
所有类的祖先类都是Object
Super用于继承父类时
如果是构造方法则super必须在第一行
如果是普通方法则随意
当实例化构造方法时,现调用父类构造方法,后调用子类构造方法
子类继承父类所有的成员变量和成员方法,但不集成父类的构造方法



原创粉丝点击