Java基础知识之接口和抽象类的区别
1.接口
接口是抽象方法的集合,一个接口只有方法的形状而没有方法的具体实现,接口是Java面向对象提供的一种机制。
Java语言是一种单继承的,在类的继承中通过实现多个接口间接实现了多继承功能。接口的申明:
[public] interface InterfaceName{
void method1(int arg1);
void method2();
...
}
2.抽象类
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。抽象类申明:
[public] abstract class ClassName {
abstract void fun();
void fun2();
...
}
3.接口和抽象类区别
(1)、接口只能包含抽象方法,抽象类可以包含普通方法;
(2)、接口的方法都是完全抽象的,并且方法必须是public,而且默认方法是public abstract的,抽象中的方法可以被public,protected等修饰符修饰;
(3)、子类用implements来实现接口,子类需要实现接口中的所有方法,但继承抽象类可以不重写父类中非抽象方法,抽象类中的抽象方法必须被重写;
(4)、一个类可以实现多个接口,但只能继承最多一个抽象类,接口可以继承一个或者多个接口;
(5)、抽象类中可以有普通成员变量,接口中没有普通成员变量,只能有常量;
(6)、抽象类中的方法可以被static修饰,接口中的方法不可以被static修饰;
(7)、抽象类可以有构造函数,接口不可以有构造函数。
PS:相同点是都不能实例化(不能new),都有抽象方法,子类中必须对父类方法进行重写。
4.接口和抽象类的使用场景
接口主要用于实现多继承的场景和模块与模块之间的调用情况,抽象类主要用于当做基础类使用,即基类(基类里面的一些方法都有默认的方法实现,即实现接口的公用的代码,个性化的方法由各个子类去实现)。
5.Demo
下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作:
抽象类定义:
abstract class Door {
public abstract void open();
public abstract void close();
}
或者接口定义如下:
interface Door {
void open();
void close();
}
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close(),也许这个类根本就不具备open( )和close()这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。最终的方案源码如下:
abstract class Door{
void open();
void close();
}
interface Alarm {
void alarm();
}
public class AlarmDoor extends Door implements Alarm {
void open() {
...
}
void close() {
...
}
void alarm() {
...
}
}
网友评论