抽象类和接口的区别
抽象类:是不可实例化的类,但是可以有属性有方法,方法可以有方法体,继承关键字用extends,类只能有一个父类(单一继承),类如果继承抽像类可以覆盖抽象类的方法也可以不覆盖直接用抽象类的方法。
接口:可以说成是一个特殊的抽象类,可以有属性有方法,但是方法只能有声明,不能有方法体,实现接口使用的关键字是implements,一个类可以实现多个接口,如果一个类实现了一个接口那么这个类就要实现接口中所有的方法。
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正 由于这两种机制的存在才赋予了java强大的面向对象能力。abstract calss和interface之间对于抽象类支持方面有很大的相似性,甚至可以互相替换,然而两者之间还是有很大的区别的。
语法层面上,两者的定义方式不同,就以一个名为Demo的抽象类为例说明这种不同。
使用abstract class的方式来定义如下:
abstract class Demo {
abstract void method1();
abstract void method2();
...
}
使用interface方式定义Demo抽象类的方式如下:
interface Demo{
void method1();
void method2();
.....
}
在abstract class方式中,Demo可以有自己的数据成员,也可以由非abstract的成员方法,而在interface方式中,Demo只能有静态不恩能够被修改的数据成员(也就是必须是static final的,不过interface中一般不定义数据成员),所有的成员方法都是abstract的。某种意义上说,interface是一种特殊形式的abstract class。
abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
总的来说,两者的直观区别就是:
抽象类是单继承,接口可以多继承
接口中的所有方法都是抽象和公共的