抽象類和接口的異同


   Java中的兩種抽象定義:一為抽象類(Abstract Class),二為接口(Interface)。

一、抽象類Abstract Class

  抽象類是關鍵字abstract修飾的類,既為抽象類,抽象抽象即不能被實例化。而不能被實例化就無用處,所以抽象類只能作為基類(父類),即被繼承的類。抽象類中可以包含抽象方法也可以不包含,但具有抽象方法的類一定是抽象類。

  抽象類的使用原則如下:

  • (1)被繼承性抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public
  • (2)抽象性抽象類不能直接實例化,需要依靠子類采用向上轉型的方式處理;
  • (3)抽象類必須有子類,使用extends繼承,一個子類只能繼承一個抽象類;
  • (4)子類(如果不是抽象類)則必須覆寫抽象類之中的全部抽象方法(如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。

  比如:  

 1 package com.fzz.test;
 2 
 3 //抽象類A
 4 abstract class A{
 5     public void fun(){//普通方法
 6         System.out.println("存在方法體的方法");
 7     }
 8 
 9     public abstract void print();//抽象方法,沒有方法體,有abstract關鍵字做修飾
10 
11 }
12 //單繼承特性
13 class B extends A{//B類是抽象類的子類,是一個普通類
14     @Override
15     public void print() {//強制要求重寫
16         System.out.println("Why is more important than what!");
17     }
18 
19 }
20 //測試類
21 public class TestDemo {
22     public static void main(String[] args) {
23         A a = new B();//多態:向上轉型
24         a.fun();//被子類所覆寫的過的方法
25     }
26 }

  詳細可參考:https://blog.csdn.net/wei_zhi/article/details/52736350

二、接口Interface

  在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。

  1、接口與類相似點

  • 一個接口可以有多個方法。
  • 接口文件保存在 .java 結尾的文件中,文件名使用接口名。
  • 接口的字節碼文件保存在 .class 結尾的文件中。
  • 接口相應的字節碼文件必須在與包名稱相匹配的目錄結構中。

  2、接口與類的區別

  • 接口不能用於實例化對象。
  • 接口沒有構造方法。
  • 接口中所有的方法必須是抽象方法。
  • 接口不能包含成員變量,除了 static 和 final 變量。
  • 接口不是被類繼承了,而是要被類實現。
  • 接口支持多繼承。

  3、接口特性

  • 接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
  • 接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(並且只能是 public,用 private 修飾會報編譯錯誤)。
  • 接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。

  4、接口的繼承

  當類實現接口的時候,類要實現接口中所有的方法。否則,類必須聲明為抽象的類。類使用implements關鍵字實現接口。在類聲明中,Implements關鍵字放在class聲明后面。

  Java中類不允許多繼承但接口可以。

 1 // 文件名: Sports.java
 2 public interface Sports
 3 {
 4    public void setHomeTeam(String name);
 5    public void setVisitingTeam(String name);
 6 }
 7  
 8 // 文件名: Football.java
 9 public interface Football extends Sports
10 {
11    public void homeTeamScored(int points);
12    public void visitingTeamScored(int points);
13    public void endOfQuarter(int quarter);
14 }
15  
16 // 文件名: Hockey.java
17 public interface Hockey extends Sports
18 {
19    public void homeGoalScored();
20    public void visitingGoalScored();
21    public void endOfPeriod(int period);
22    public void overtimePeriod(int ot);
23 }

三、異同

  abstract class和interface是支持抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的面向對象能力。abstract class和interface之間在對於抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstract class和interface的選擇顯得比較隨意。具體看下表:

  


免責聲明!

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



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