探究Java的接口和抽象类--------Java的系列学习之路(13)

前言——

今天第二天军训,训得有点累,但是训完整个人感觉很舒服,之前太久没运动让整个人感觉起来都很没有 活力~   注:欢迎转载,转载请注明来处

 

目录

一.抽象类

二.接口(interface)

三.抽象类和接口的比较


一.抽象类

a.要了解抽象类之前,我们需要先知道什么是抽象方法?

抽象方法就是方法前面加上abstract修饰,且类中的抽象方法只有声明,没有实现。

b.知道了什么是抽象方法之后,那抽象类是什么呢?

含有抽象方法的类称为抽象类,如果一个类含有抽象方法,那么我们必须在这个类的签名加上abstract关键字来把它声明为抽象类,不然就会像下面这样报错。

在第14行中声明了一个抽象方法,那么Car就是一个抽象类了,但是忘了加abstract了,因此报错了。

正确如下:
abstract class Car{
	
     abstract public void airCondition() ;
}

 

c.抽象类的存在有何意义?

抽象类纯粹是为了继承而生的。如果一个方法在父类中实现出来没有任何意义的话,必须根据子类的实际情况来进行对应的实现,那么我们就可以把该方法声明为抽象方法,进而再把该类声明为抽象类。如果定义了一个抽象类,但是却没有任何子类继承它的话,那么可以说这个抽象类就废了。。

d.关于抽象类和非抽象类的一些区别

1)抽象方法在抽象类中只能是public(隐式指定为public)或者protected属性的,不能为private,不然会报错。

其实这个也是非常容易理解的,因为private方法无法被继承。

 

2)抽象类不能用来创建一个对象,说白了也就是不能new。

3)如果子类只对抽象父类中的部分抽象方法进行自我实现的话,那么这个子类也还是算抽象类,必须将这个子类加上abstract来定义成抽象类。只有对抽象父类的全部抽象方法进行自我实现,那么才能把这个子类定义为非抽象类。

在这边,子类bus没有把抽象父类Car中的skyLight()方法进行自我实现,所以继承完之后,bus中还是有抽象方法,所以bus类理所应当还是abstract类,所以应该在24行前面加上一个abstract。

除以上3点外,抽象类和其他类没有任何其他差别。

 

 

二.接口(interface)

接口在软件开发中,泛指供别人调用的方法或者函数。在Java中是对一类行为的抽象(下面会对此句话进行解释,方便大家理解)

1.接口中的细节。

接口中可以定义方法或者变量。接口中的变量会被隐式指定为 public static final,但是接口中一般不定义变量。接口中的方法都会被隐式指定为public abstract,都是公共的抽象方法(只能为public,设置为private或者protected会报错)。

 

2.类调用接口的语法结构

class  xxxx implements  interface1,interface2...{

}

可以看到,允许一个类调用多个接口,但是要注意,只有把所调用接口中的每个抽象方法都自我实现后,才能把这个子类声明为非抽象类;如果没有把接口中的抽象方法全部自我实现的话,那么这个类由于仍然含有抽象方法,所以仍然是抽象类。因此要把这个类声明为abstract 类,不然会报错。如下面所示,Bus没有把skyLight这个接口中的showSkyLight()进行自我实现,这时候就应该在21行前面添加一个abstract,声明为抽象 类。

 

 

三.抽象类和接口的比较

1)一个子类只能继承一个抽象类(Java中的单继承),但是一个子类可以继承多个interface,一定程度上来讲,Java中的接口就是为了弥补无法多继承带来的不方便。

2)抽象类中可以有抽象方法,也可以有非抽象方法,但是接口中只能有public abstract的抽象方法。同理,抽象类中的变量可以是多种类型的,但是接口中的变量就只能是public static final类型的。

3)设计层面上的不同,这块我会具体展开

假如我要创建一个bus对象和一个货车对象,由于货车和bus的汽车都属于汽车,那么我自然会创建一个Car类,这个Car类含有汽车的共同属性,比如都含有前进,后退,左转,右转,空调,加速,减速等。但是在Car类中没有必要对这么多的共同属性进行定义,一部分只需要子类继承时再自我实现就可以了。所以啊,把一些方法设置为抽象方法,再把Car类设置为抽象类,这无疑是最好的选择。

创建一个抽象Car类之后,假如bus需要含有无人驾驶的功能,那么我们应该如何把无人驾驶这个属性或者方法添加进去呢?一个很自然的想法就是在bus内部自己添加一个无人驾驶的方法。但是这样设计我觉得不大好啊,无人驾驶的功能可能存在多种子类上,比如无人驾驶的小车,公交车,甚至货车,如果分别在其内部加入同一个功能的话,那么感觉有点重复。

另一个想法,就是在抽象类中添加一个抽象的无人驾驶的对应方法,这样一来,继承它的子类就都具有无人驾驶的方法了,但是这样也是不行啊,有的子类没有无人驾驶的功能,那么它就不会自己去实现无人驾驶这个方法的定义,那么这时子类就还是抽象类了,不能创建对象了,这不符合我们的需要啊,我们需要创建子类对象。

最好的方法就是创建一个interface,这个接口含有抽象的无人驾驶方法,有需要的拓展无人驾驶这个功能的子类只需自行遵循这个接口就可以啦!!

说到这边,大家是不是有点感觉了,抽象类中的方法偏向于一些很基本的属性方法,比如Car都一定要有的加速和刹车功能。而interface中的抽象方法是一些拓展属性,需要的可以自行遵循接口,如无人驾驶功能

所以最好的设计如下:

 

 

 

猜你喜欢

转载自blog.csdn.net/CCSGTC/article/details/82987331