抽象類和接口的異同

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

1、抽象類Abstract Class

  抽象類是關鍵字abstract修飾的類,既爲抽象類,抽象抽象即不能被實例化。而不能被實例化就無用處,因此抽象類只能做爲基類(父類),即被繼承的類。抽象類中能夠包含抽象方法也能夠不包含,但具備抽象方法的類必定是抽象類。編程

  抽象類的使用原則以下:編程語言

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

  好比:  ide

 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測試

2、接口Interface

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

  一、接口與類類似點

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

  二、接口與類的區別

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

  三、接口特性

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

  四、接口的繼承

  當類實現接口的時候,類要實現接口中全部的方法。不然,類必須聲明爲抽象的類。類使用implements關鍵字實現接口。在類聲明中,Implements關鍵字放在class聲明後面。.net

  Java中類不容許多繼承但接口能夠。code

 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 }

3、異同

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

  

相關文章
相關標籤/搜索