Java中接口和抽象类
java只支持单继承,但可以继承多个接口,interface和abstract class 是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的。
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
接口的抽象级别更高
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。狗和猫是都可以抽象为动物。
人可以吃东西,猫也可以吃东西,你可以把“吃东西”定义成一个接口,然后让人或猫这些类去实现它.
什么时候用interface,什么时候用abstract class?
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
相同点:
相同一
都不能被实例化
相同二
接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化
不同点:
一、从语法定义层面看abstract class和interface
区别一
abstract class可以有自己的数据成员,也可以有非abstract的方法,可以用public ,protected,private,final,static修饰
interface只能有静态的不能被修改的数据成员,也就是必须是public static final的数据成员,不过一般interface中没有数据成员,只有方法,所有的方法都是public abstract的,不存在静态的方法
区别二
abstract class 可以有默认的方法,比如要给男人和女人同时增加一个走路的方法,不需要在每个类中添加,只需要在抽象类人中添加一个具体方法,那么所有的子类就有了走路的方法。
interface在JDK8之前是不能提供具体的方法,只能提供抽象的方法,JDK8开始,可以有默认方法
二、从设计层面看abstract class和interface
区别三
abstract class 是is的关系
比如说飞机是运输工具,燕子是鸟
interface 是can的能力
飞机和燕子都能飞