Java中,接口(interface)与抽象类(abstract class)是两个不一样的机制。
先来看两者的概念。
一、概念
1、接口:接口是方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
接口可以看作是一种特殊的类(一种纯抽象类),在接口内部,只能声明方法,但不能有方法的具体实现。
接口可以继承接口,但不能继承类。同时,接口不能实现接口。
2、抽象类:用于表达概念而不用于构造实体的类。
一般设置一个抽象类作为父类,这个抽象类是为了表达一种公共的概念,比如Animal( )类就是一个抽象的概念(不是具体的),该类就可以设置为一个抽象类,而Animal( )的子类可以是具体的实现,比如Pig( )类、Dog( )类。
抽象类可以定义变量,但不能创造出抽象类的对象。如:
Animal dog = new Dog( ); //这是允许的,因为这是一种向上造型。
有抽象函数的类必须是抽象类。抽象函数只能声明,但不能有具体的实现。
然后我们来说说接口和抽象类的区别在哪里。
二、区别
1、相同点:
两者都不能创造出自身对象。
2、不同点:
(1) 接口中只能有方法的声明,不可以有方法的实现。而抽象类中可以有方法的声明和实现(但抽象函数不能有具体的实现)。
(2) Java没有多重继承机制,但是类可以实现多个接口,因此,在某种意义上,接口弥补了Java没有多重继承的缺点。而类只能继承于一个抽象类。
(3) 接口内的变量默认是public static final型的,必须有初值,且不能被更改;接口内的方法都是public abstract型,不能有具体实现。而抽象类中可以有变量默认是defalut型,也可以有具体实现的方法。
(4) 接口主要是用于方法的合集,适合日后方法的添加删除。而抽象类主要用于表达一种“总”的概念,使逻辑更加清晰,让代码更贴近生活,但抽象类内部不适合在日后进行更改。