抽象方法可以存在于抽象类中,而接口中所有的方法都是抽象的,从这个角度说,接口是一种特殊的抽象类。那么接口和抽象类之间有什么不同呢?
1.基本语法不同
接口中所有的方法都是抽象的,即只有方法的定义,没有方法的实现。但是抽象类中可以包含抽象方法,也可以包含非抽象方法,即抽象类中既可以有方法的定义,也可以有方法的实现。如定义一个Animal接口和定义一个Animal抽象类。
Animal接口的代码如下:
Animal抽象类的代码如下:
从第1行代码看出,Animal接口和Animal抽象类由于所属包的不同,故可以同名。从Animal接口的第2行代码中的interface关键字可以看出,该Animal是一个接口。从Animal抽象类的第2行代码中的abstract class关键字可以看出,该Animal是一个抽象类。
Animal接口中的第3、4行代码是接口中的两个抽象方法,接口中所有的方法都是抽象的,故方法的返回值前面的public abstract修饰符是可以省略的,所以第3行代码可以简写为:void eat();第4行代码可以简写为:void fly()。
Animal抽象类的第3行代码定义了抽象方法,此时void前面的public abstract不能省略。第4行代码定义了抽象类中的非抽象方法,而在接口中是不能定义非抽象方法的。
2.实现类不同
类和接口之间的关系是类实现接口,而且可以同时实现多个接口。类和类之间的关系叫继承,一个类只能继承一个类。
Concreate Animal类实现接口Animal,示例代码如下:
ConcreateAnimal类继承抽象类Animal,示例代码如下:
上述两个ConcreateAnimal类所属的包不同,所以可以重名。类实现接口用implements关键字,类继承类用extends关键字。
接口实现类ConcreateAnimal要重写接口中所有的抽象方法,抽象类的子类Concreate Animal只需要重写抽象类中的抽象方法,直接继承抽象类中的非私有的非抽象方法。
3.设计思想不同
“抽象”在面向对象思想中是一个很重要的概念。Java中实现抽象有两种方式:接口和抽象类。
抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。因此,抽象类表示的是“is a”关系,接口表示的是“like a”关系。在实际的开发中,对于接口和抽象类的选择,反映出设计人员看待问题的不同角度。(www.xing528.com)
【例4-8】 以动物为例,默认所有的动物都具有吃的功能。设计接口和抽象类。
Animal接口代码如下:
第2行代码中的interface关键字说明该Animal是接口,第3 行代码定义了eat抽象方法。
Animal抽象类代码如下:
第2行代码中的abstract class关键字说明该Animal是一个抽象类,第3行代码定义了eat抽象方法。
不管是实现接口,还是继承抽象类的具体动物,都具有吃的功能,实现接口的具体的动物类的示意代码如下:
继承抽象类的具体的动物类的示意代码如下:
具体的动物类不光具有吃的功能,如有些动物还会飞,那么如何设计既会吃又会飞的接口和抽象类呢?很简单,只需要在接口和抽象类中增加相应的方法即可。
Animal接口的代码修改如下:
Animal抽象类的代码修改如下:
此时问题就出现了,当Concreate Animal不管是实现接口还是继承抽象类,都代表这种动物既会吃也会飞。这是与现实不符的,因为有的动物不会飞,而会飞的也不一定是动物,这就需要把eat方法和fly方法分开,定义在两个接口或者两个抽象类中。
增加一个Animal Fly接口,该接口中只有一个fly方法,内容如下:
增加一个AnimalFly抽象类,该接口中只有一个fly方法,内容如下:
此时,如果这个动物既会吃又会飞,我们可以怎么做呢?可以让这个动物同时实现只有eat方法的Animal接口和只有fly方法的Animal Fly接口,代码如下:
从第2行代码中的implements Animal,Animal Fly可以看出该类既实现了Animal接口,也实现了AnimalFly接口,当然该类也就需要重写两个接口中的所有方法。第3 行重写了Animal接口中的eat方法,第4行代码重写了AnimalFly接口中的fly方法。这就使得该类Concreate Animal的对象既会吃也会飞。当然,除了同时实现两个接口外,还可以实现只有eat方法的Animal接口的同时,继承只含有fly方法的Animal Fly抽象类。具体代码请读者自行完成。
在实际的开发中,究竟是选择接口还是抽象类,这得具体问题具体分析。当然,这也和程序员看待问题的角度和开发习惯有关。一般情况下,能够使用接口实现的不用抽象类。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。