《HeadFirstJava》是最通俗易懂也是最适合小白入门的JAVA书。segmentfault
好久好久之前,我在学习《HeadFirstJAVA》时,尝试着把本身理解的内容写成文章,因而就有了《一个小白眼中的“面向对象”》,如今,书已经完全读完了,因此要再写一些本身的体会。学习
在软件开发中,有这样一个规律:spa
咱们能够从这个角度,来看一看对象、类、接口、继承之间的关系。3d
咱们已经知道,类是对象的模板,对象是类的克隆。
当咱们须要建立一系列相同的对象时,就把它们共有的部分抽象出来,所以就有了类。对象
(一)blog
开始以前,咱们先想想,全部的动物都有吃饭这个方法eat(),若是每种动物都单独写一个eat()方法,那就是许许多多相同的代码。继承
既然又出现了相同的代码,咱们可不能够把它们抽象出来呢?可不能够写一个通用的类,包含了这些共同的方法,而全部具体的类都“克隆”这个通用的方法呢?
固然能够,因而就有了下图:接口
这就是继承,被继承的类称为父类,执行继承的类叫作子类,继承的做用在于,子类拥有了父类的全部属性和方法。图片
对于初学者来讲听到这个词,可能会想到现实中的财产继承,但计算机的继承和这个并不同,若是用一个更贴切的词语来形容计算机的“继承”,那应该是生物学中的“遗传”。开发
为何说计算机的继承有点像“遗传”呢,由于并非子类继承以后,父类就没有了,而是把父类完整的复制一份,不管发生多少次继承,父类都仍是那个父类,一点也没有减小。
(二)
虽然全部的动物都会吃,但并非全部动物都会飞,若是想给鸟类添加fly()的方法,能够吗?
固然能够。
(三)
若是全部陆生动物都会走路,但并非全部的动物走路姿式都同样,那么可不能够只给几种特殊的动物定义单独的wolk(),而其余的动物使用父类的work()呢?
固然能够。
所以又引出一个结论:
当对象被调用了一个方法,程序会先从对象所属的类中寻找此方法,若是没有,再去此类的父类中寻找,若是尚未,就一直向上寻找,直到找到最顶层的父类,若是尚未,就会报错。
(四)
咱们继续第三个问题,全部的动物都有鸣叫的方法call(),可是全部的动物叫声都不同,那么若是new一个Animal对象,它会怎么叫呢?
答案是:根本就不存在Animal这种对象,所以,有些类是不能new的。这种对象一旦new出来,不只没有意义,并且很危险。
因此,必需要对这种特殊的类,作一个标注,使它不能new,但能够被继承。
这样,就有了抽象类,抽象类中至少有一个抽象方法。
抽象的,就是不具体的,这意味着只须要关注抽象方法的功能,而不关心它的具体实现方式。抽象方法只有方法名、返回值类型,而没有语句,因此它不能被执行。
抽象类只有被具体类继承,而且经过覆盖父类的方法,把抽象方法实现以后,才能被new出来。
由于上图中的Bird,覆盖了Animal的Call(),它不包括任何抽象方法,因此Bird是一个具体的类,能够被new出来。
(五)
人类是哺乳类动物也是灵长类动物,那么能够同时继承两个类吗?
在回答问题以前,先来看一个例子:
播放器按照功能能够分为CD、VCD、DVD,他们都有播放方法Play()。
若是有一种新型的VCD和DVD的综合播放器,那应该怎么继承呢?
同时继承两个父类,看似这样没问题,但实际调用Play()的时候,到底调用哪一个父类的Play()方法呢?
因此这是不行的,事实上,Java也是不容许这样作的。
那么若是有这种“继承”两个类的需求,怎么办呢?
有一种方法,就是把Play()变成抽象方法,让复合播放器实现这个抽象方法,便可。
但这样作,只是把多重继承变成了单一继承,虽然可用,但没有从根本上解决问题。
因而,接口出现了,接口的出现就能够解决多重继承的问题。
(六)
若是有一种宠物猫,它既有猫的属性,也有做为宠物的功能,按理说,它应该同时继承于Animal和Pet这两个类,可现实是不容许这么作。
如何用接口实现呢?——把Pet类的全部方法都变成抽象方法!而Animal不变。
这样,从理论上能够避免方法的冲突。为何呢?由于实现抽象方法必需要覆盖,这样,即便父类和这个抽象类有重名方法,也会被子类覆盖掉。
但Pet毕竟仍是个类啊,Java不容许继承两个类。
因此,什么是接口呢?接口就是100%抽象的类。接口只有抽象方法。
如今的Cat类依然能够继承Animal,但对于Pet来讲,就不是继承了,而是实现了Pet接口。
因为接口实100%抽象的,因此永远也不会出现方法重名了。
用一句话概况就是,一个类只能继承另外一个类,接口只能继承另外一个接口,但类能够实现多个接口。
其实接口(interface)也属于类(class),那么他们有什么区别呢?
类是用来New对象的,接口是用来被实现的,因此当某个类实现了某个接口以后,它就具有了这个接口的全部功能。所以才说:接口其实是一种协议、一种规范。
让咱们回到这个规律:
由于一样的对象出现了两次,因此把对象的共同点抽象出来,就有了类。
由于两个类有相同的功能,因此把相同的功能抽象出来,就有了继承。
由于要解决继承两个类的问题,因此把一个类抽象出来,就有了接口。
本文的内容大可能是基于《Head First Java》精简出来的,所以比较基础,实际项目中,类和接口有它们特定的做用。
接口是图纸,是上层建筑,是从宏观上规划一个项目的构成。就像钱塘江大桥的修筑,固然不能从头开始一点一点的来搭建,而是先有图纸,再有零件。把一个项目分红几个大零件,最后再拼装起来。
类是方便量产零件的模具。当开发商拿到图纸以后,只看图纸造零件并非很方便,生产效率也低。因而开发商在图纸的基础上进行加工,使其从扁平的图纸变成一个个活生生的模板,根据这个模板能够直接量产零件。这样就提升了效率。
回到计算机,实际的软件项目就是,先定接口,接口规范了某个方法的功能,但不关心具体实现方式。
而后就能够放心的分工了,因为接口是肯定的,只要每一个人的代码都遵循接口的规范,就能够保证合做编写的代码能够成功对接。
在这些接口上写出来的类,就能够知足项目的功能了。
因此类是量产的模具,接口除了解决多重继承以外,也是项目的图纸。