浅谈Java中接口与抽象类的异同
抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似。期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别。硬着头皮,做出一波小总结。或许,学习了之后的知识,理解会更加深刻吧,奥利给!
语法上的区别
-
一个类最多只能继承一个抽象类,但是可以继承多个接口。
-
接口中的变量声明默认是final的,但是抽象类中可以包含非final的变量。
-
接口中的成员必须都是public的,而抽象类的成员可以是普通类成员的常用风格,即public,private和protected都可以修饰。
-
接口应用关键字
implements
来实现,抽象类应使用关键字extends
进行扩展。 -
一个普通类要是想要实现一个接口,就必须实现接口中的所有方法,但是继承抽象类的情况,可以让继承类用abstract修饰,从而不直接实现抽象类中的抽象方法。
-
接口只能继承接口,而抽象类能继承其他类或者多个接口,且抽象类可以在不提供接口方法实现的情况下实现接口。
深入理解
在默认方法在接口中出现之前,抽象类相比于接口有一个明显的优势在于:有更好的前向兼容性(forward-compatibility),即在不破坏既有代码的情形下继续在类中添加新的功能。但是默认方法的出现,让接口也能够实现这个效果。这个在上一篇提到过:浅谈Java的默认和静态方法
abstract class People{
private int age;
public abstract void doSomething();
}
interface studyable {
void howToStudy();
default void info() {
System.out.println("study is important for everyone..");
}
}
- 接口和抽象类都可以实现多态,多态的好处有目共睹,利用向上转型及动态绑定,即在运行时才确定对象的类型,大大增加了扩展性。
public static void main(String[] args) {
studyable[] studyables = new studyable[]{new Robot(),new Student()};
for (studyable s : studyables) {
s.howToStudy();
s.info();
}
System.out.println("*************************************");
People[] peoples = new People[]{new Student(),new Teacher()};
for (People p : peoples) {
p.doSomething();
}
}
//测试结果
Robot comes out
Student comes out!
robot need to practice
study is important for everyone..
student will read book..
study is important for everyone..
*************************************
Student comes out!
Teacher comes out!
student should study..
teacher should teach..
参考链接:what is the difference between an interface and abstract class