Java学习笔记之二——图解继承与接口

零、前言

《HeadFirstJava》是最通俗易懂也是最适合小白入门的JAVA书。segmentfault

好久好久之前,我在学习《HeadFirstJAVA》时,尝试着把本身理解的内容写成文章,因而就有了《一个小白眼中的“面向对象”》,如今,书已经完全读完了,因此要再写一些本身的体会。学习

在软件开发中,有这样一个规律:spa

  • 绝对不重复造轮子,只要一段代码出现了两次,就必定要把它们共有的代码抽象出来。

咱们能够从这个角度,来看一看对象、类、接口、继承之间的关系。3d

类和对象

咱们已经知道,类是对象的模板,对象是类的克隆。
当咱们须要建立一系列相同的对象时,就把它们共有的部分抽象出来,所以就有了类。
图片.png对象

类和继承

(一)blog

开始以前,咱们先想想,全部的动物都有吃饭这个方法eat(),若是每种动物都单独写一个eat()方法,那就是许许多多相同的代码。继承

图片.png

既然又出现了相同的代码,咱们可不能够把它们抽象出来呢?可不能够写一个通用的类,包含了这些共同的方法,而全部具体的类都“克隆”这个通用的方法呢?
固然能够,因而就有了下图:接口

图片.png

这就是继承,被继承的类称为父类,执行继承的类叫作子类,继承的做用在于,子类拥有了父类的全部属性和方法图片

对于初学者来讲听到这个词,可能会想到现实中的财产继承,但计算机的继承和这个并不同,若是用一个更贴切的词语来形容计算机的“继承”,那应该是生物学中的“遗传”。开发

为何说计算机的继承有点像“遗传”呢,由于并非子类继承以后,父类就没有了,而是把父类完整的复制一份,不管发生多少次继承,父类都仍是那个父类,一点也没有减小。

  • 因此,子类能够得到父类的方法和属性

(二)

虽然全部的动物都会吃,但并非全部动物都会飞,若是想给鸟类添加fly()的方法,能够吗?
固然能够。

图片.png

  • 因此,子类能够定义本身独有的方法

(三)

若是全部陆生动物都会走路,但并非全部的动物走路姿式都同样,那么可不能够只给几种特殊的动物定义单独的wolk(),而其余的动物使用父类的work()呢?
固然能够。
图片.png

  • 因此,子类能够覆盖父类的方法

所以又引出一个结论:

当对象被调用了一个方法,程序会先从对象所属的类中寻找此方法,若是没有,再去此类的父类中寻找,若是尚未,就一直向上寻找,直到找到最顶层的父类,若是尚未,就会报错。

(四)

咱们继续第三个问题,全部的动物都有鸣叫的方法call(),可是全部的动物叫声都不同,那么若是new一个Animal对象,它会怎么叫呢?

图片.png

答案是:根本就不存在Animal这种对象,所以,有些类是不能new的。这种对象一旦new出来,不只没有意义,并且很危险。
因此,必需要对这种特殊的类,作一个标注,使它不能new,但能够被继承。
这样,就有了抽象类,抽象类中至少有一个抽象方法

图片.png

抽象的,就是不具体的,这意味着只须要关注抽象方法的功能,而不关心它的具体实现方式。抽象方法只有方法名、返回值类型,而没有语句,因此它不能被执行。
抽象类只有被具体类继承,而且经过覆盖父类的方法,把抽象方法实现以后,才能被new出来。
图片.png

由于上图中的Bird,覆盖了Animal的Call(),它不包括任何抽象方法,因此Bird是一个具体的类,能够被new出来。

类和接口

(五)

人类是哺乳类动物也是灵长类动物,那么能够同时继承两个类吗?
在回答问题以前,先来看一个例子:

播放器按照功能能够分为CD、VCD、DVD,他们都有播放方法Play()。
图片.png

若是有一种新型的VCD和DVD的综合播放器,那应该怎么继承呢?

图片.png

同时继承两个父类,看似这样没问题,但实际调用Play()的时候,到底调用哪一个父类的Play()方法呢?

因此这是不行的,事实上,Java也是不容许这样作的。

那么若是有这种“继承”两个类的需求,怎么办呢?

有一种方法,就是把Play()变成抽象方法,让复合播放器实现这个抽象方法,便可。

图片.png

但这样作,只是把多重继承变成了单一继承,虽然可用,但没有从根本上解决问题。

因而,接口出现了,接口的出现就能够解决多重继承的问题。

(六)

若是有一种宠物猫,它既有猫的属性,也有做为宠物的功能,按理说,它应该同时继承于Animal和Pet这两个类,可现实是不容许这么作。

图片.png

如何用接口实现呢?——把Pet类的全部方法都变成抽象方法!而Animal不变。

图片.png

这样,从理论上能够避免方法的冲突。为何呢?由于实现抽象方法必需要覆盖,这样,即便父类和这个抽象类有重名方法,也会被子类覆盖掉。

但Pet毕竟仍是个类啊,Java不容许继承两个类。

因此,什么是接口呢?接口就是100%抽象的类。接口只有抽象方法

如今的Cat类依然能够继承Animal,但对于Pet来讲,就不是继承了,而是实现了Pet接口。

图片.png

因为接口实100%抽象的,因此永远也不会出现方法重名了。

用一句话概况就是,一个类只能继承另外一个类,接口只能继承另外一个接口,但类能够实现多个接口。

其实接口(interface)也属于类(class),那么他们有什么区别呢?
类是用来New对象的,接口是用来被实现的,因此当某个类实现了某个接口以后,它就具有了这个接口的全部功能。所以才说:接口其实是一种协议、一种规范。

总结

让咱们回到这个规律:

  • 绝对不重复造轮子,只要一段代码出现了两次,就必定要把它们共有的代码抽象出来。

由于一样的对象出现了两次,因此把对象的共同点抽象出来,就有了类。
由于两个类有相同的功能,因此把相同的功能抽象出来,就有了继承。
由于要解决继承两个类的问题,因此把一个类抽象出来,就有了接口。

扩展

本文的内容大可能是基于《Head First Java》精简出来的,所以比较基础,实际项目中,类和接口有它们特定的做用。

接口是图纸,是上层建筑,是从宏观上规划一个项目的构成。就像钱塘江大桥的修筑,固然不能从头开始一点一点的来搭建,而是先有图纸,再有零件。把一个项目分红几个大零件,最后再拼装起来。

类是方便量产零件的模具。当开发商拿到图纸以后,只看图纸造零件并非很方便,生产效率也低。因而开发商在图纸的基础上进行加工,使其从扁平的图纸变成一个个活生生的模板,根据这个模板能够直接量产零件。这样就提升了效率。

回到计算机,实际的软件项目就是,先定接口,接口规范了某个方法的功能,但不关心具体实现方式。
而后就能够放心的分工了,因为接口是肯定的,只要每一个人的代码都遵循接口的规范,就能够保证合做编写的代码能够成功对接。
在这些接口上写出来的类,就能够知足项目的功能了。

因此类是量产的模具,接口除了解决多重继承以外,也是项目的图纸。

相关文章
相关标签/搜索