Java中接口(interface)和抽象類(abstract)的區別


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類一次也只能繼承一個抽象類。

不過二者都不能被實例化,如果要實例化對象,那么就要實現內部所有的抽象方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM