刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别。今天静下来,翻翻书,查查资料,做个小结。首先举两个例子,看看interface和abstract class 在“外形”上有啥异同。
1、先看一下抽象类:
abstract class Person{
private String name;
private Person(String n)
{
name=n;
}
public abstract String getDescription();
public String getName()
{
return name;
}
}
抽象类的主要特征有两个: 一、申明类的时候添加abstract关键字。二、有抽象方法。
抽象方法:只有申明,没有函数体。例如上面的例子,对人(Person)的描述不能一概而论,对于学生,对于老师,对于医生。。。。。。所以在这种情况下可以定义为抽象方法,抽象方法可以(必须)在继承它的子类中实现。抽象类中可以有域(属性),也可以有完整的方法,除了有抽象方法外,与普通类没什么区别。值得注意的是,由于抽象类不完整、具有不确定性,是不能实例化的,只能作为基类被继承。
2、再看一下接口
interface Usb{
int numbers=2;//自动定义类型为 static final
void toKeyboard();//自动定义为public 类型
void toMouse();//自动定义为public 类型
}
接口也可以定义为public类型,但是和类一样,必须保证所在文件的名字和接口名一直。如果不加public,那么该接口仅面向同包的类。虽然interface取代了class关键字,但我还是有一个疑问,接口是不是也是一种类?后来查阅发现:
接口和类同属于引用数据类型,是并列的。
3、总结抽象类和接口的区别
(1)抽象类和接口,都是抽象思想的体现,抽象类是对类的抽象,接口是对“可以实现的功能”的抽象,就是说通过接口,我可以实现某种功能,不是天生的,但是可以学。举个例子,例如在抽象电脑这个客观存在的事物时,可以把它设计成Computer类,我们还可以设计一个USB接口,让他接个鼠标和键盘,这样就具有了输入的功能。而电脑与生俱来的功能,例如显示屏显示信息,cpu计算结果,内部电路芯片等,可以封装在Computer类里面。
(2)接口相对于抽象类来说,更加抽象。这个从形式上就可以看出。接口中的的方法必须是抽象方法,但是抽象类的方法可以是完整(有方法体)的。
(3)抽象类说到底还是一个类啊,java中是不支持多继承的,虽然这么做确实降低了程序设计的复杂性,但只能继承一个类可能不一定能满足得了实际开发上的需求。那么接口(interface)在某种度上弥补了这种缺陷,因为它是可以被多个类实现(implements)的。
部分内容参考书籍:《thinking in java》、《java核心技术卷一》
参考博客:http://www.cnblogs.com/dolphin0520/p/3811437.html
如有错误,欢迎批评指正。