Java中,接口和抽象類很普遍也很相似,但是初學者在實際寫代碼中大部分都用接口,抽象類很少用,而且也不怎么注意二者的比較,
哎,沒錯,就是我了,唉,隨着時間的流逝越發覺得自己菜的一批。
(1)首先我們先從表現形式上來看一下區別:
接口interface:關鍵字是interface,用來被類實現,可以多繼承(Java類只能單繼承)其他接口,內部都是抽象方法,所以被Java類實現(implement)的時候
就要實現內部所有的方法,內部的變量隱式的被public static final 修飾,方法則是被public abstract 修飾(而且方法只能是public權限)。
抽象類abstract:關鍵字是abstract,用來被類繼承,只能單繼承其他類,內部既可以有抽象方法,也可以有普通方法,被Java類繼承(extend)的時候
必須實現內部的抽象方法,內部的抽象方法被abstract修飾,如果子類沒有將抽象類全部實現,那么子類也要加abstract關鍵字。
(2)從意義上來說:
接口interface:接口之所以出現,其中一點就是為了滿足Java的開閉原則,即對拓展開放,對修改關閉。
例如:現在有一個接口為animal,內部定義了一個方法為call:
1 1 package com.example.dinner.service; 2 2 3 3 public interface Animal { 4 4 void call(); 5 5 }
有一個類為dog,實現這個類,同時實現內部方法:
1 package com.example.dinner.service; 2 3 /** 4 * @program: dinner 5 * @description: 6 * @author: liuqj 7 * @create: 2020-06-28 14:17 8 **/ 9 public class Dog implements Animal { 10 @Override 11 public void call() { 12 System.out.println("汪汪叫"); 13 } 14 }
可以看到小狗是汪汪叫的。那這個時候如果我再有一個類是cat呢,繼續實現這個接口:
public class Cat implements Animal {
@Override
public void call() {
System.out.println("喵喵叫");
}
}
這樣,剛開始只有一個狗,所以是汪汪叫,后來增加一個貓,叫聲為喵喵叫,而我們只是進行了拓展沒有修改任何東西,接口的意義這不就是。
那么抽象類呢?
抽象類也是對所有公共行為進行提取,區別在於,它內部不僅有抽象方法,它還有普通方法,就是在抽象類中已經實現了,子類中不用再
實現,當然你可以進行重寫。
這樣看來好像只要用抽象類就行了呀,因為抽象類中既有抽象方法,也有普通方法,而接口中只有抽象方法。
但接口本身是可以繼承多個接口的,Java類實現是可以實現多接口的。
而抽象類本身只能單繼承其他類,Java類一次也只能繼承一個抽象類。
不過二者都不能被實例化,如果要實例化對象,那么就要實現內部所有的抽象方法。