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的選擇顯得比較隨意。具體看下錶:對象