abstract用于定义抽象类,抽象类不能实例化,抽象类中既可以包含已实现的方法,也可以包含方法定义,而不具体实现。
interface用于定义接口,接口只包含常量定义和方法定义。接口本身也是一种特殊的抽象类。
抽象类和接口的区别主要有一下几个方面:
①、定义格式不同:
//抽象类定义格式
public abstract class Demo{
abstract void method1();
abstract void method2();
...
}
//接口定义格式
public interface Demo{
void method1();
void method2();
}
在抽象类中,可以包含由abstract修饰的未实现的方法,也可以包含其他已经实现的方法。在接口中,所有方法默认都是public abstract修饰的,所有成员变量都默认是public static final修饰的,且必须赋初值,后续不允许改变其值。
②、使用的方法不同:
抽象类通过继承(extends)方式使用,一个子类只能继承一个抽象类,在子类中需要实现抽象的所有抽象方法。接口通过实现方式(implements)使用,一个类可以实现多个接口,在实现类中需要将接口中所有的方法实现。
③、设计理念不同:
在一定程度上抽象类和接口很相似,一般情况下,在实现某一功能时,两者可以相互替换,因此程序员对抽象类和接口的选择比较随意。其实抽象类和接口两者的设计理念有很大的不同,抽象类用于继承,表示“is a”的关系,而接口用于实现,表示“like a”的关系。例如具有报警功能的门,可以继承一个抽象的门类,实现一个报警器的接口。
注意:抽象类与接口除了有一些区别外,它们之间也存在一些使用关系,比如抽象类允许实现一个或多个接口。
注意:
因为直接改变/扩展接口内的方法很困难,通常需要更改代码,如果有多个类实现了这个接口,则每个类都必须实现接口里的新方法。所以在JAVA8中引入了一个新概念,叫Default方法,也成为Defender方法,或者虚拟扩展方法(Virtual extension methods)。
Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,打破了之前JAVA对接口语法的限制),从而使接口在进行扩展时,不会破坏与接口相关的实现类代码。
如果一个类实现了多个接口,这些接口中有重复的Default方法,则会报错。
《你必须知道的261个JAVA语言问题》