JavaSE學習筆記(4)---抽象類和接口

JavaSE學習筆記(4)---抽象類和接口

抽象方法和抽象類

·抽象方法java

使用abstract修飾的方法,沒有方法體,只有聲明。定義的是一種「規範」,就是告訴子類必需要給抽象方法提供具體的實現。編程

特色設計模式

  1. 抽象方法必須聲明在抽象類中。
  2. 抽象方法聲明引入了一個新方法,但不提供該方法的實現,因爲抽象方法不提供任何實際實現,所以抽象方法的方法體只包含一個分號。
  3. 聲明抽象方法時,不能使用static 和private 修飾符。
  4. 當從抽象類派生一個非抽象類時,須要在非抽象類中重寫抽象方法,以提供具體的實現。

·抽象類工具

包含抽象方法的類就是抽象類。經過abstract方法定義規範,而後要求子類必須定義具體實現。經過抽象類,咱們就能夠作到嚴格限制子類的設計,使子類之間更加通用。學習

特色測試

  1. 抽象類只能做爲其餘類的基類,它不能直接實例化,對抽象類不能使用new 操做符。設計

  2. 抽象類中能夠包含抽象成員,但非抽象類中不能夠。代理

  3. 若是一個非抽象類從抽象類中派生,則其必須經過覆蓋來實現全部繼承而來的抽象成員code

    Java 中聲明抽象類時須要使用abstract 關鍵字.對象

抽象類和抽象方法的基本用法

//抽象類
abstract class Animal {
    abstract public void shout();  //抽象方法
}
class Dog extends Animal { 
    //子類必須實現父類的抽象方法,不然編譯錯誤
    public void shout() {
        System.out.println("汪汪汪!");
    }
    public void seeDoor(){
        System.out.println("看門中....");
    }
}
//測試抽象類
public class TestAbstractClass {
    public static void main(String[] args) {
        Dog a = new Dog();
        a.shout();
        a.seeDoor();
    }
}

抽象類的使用要點:

  1. 有抽象方法的類只能定義成抽象類
  2. 抽象類不能實例化,即不能用new來實例化抽象類。
  3. 抽象類能夠包含屬性、方法、構造方法。可是構造方法不能用來new實例,只能用來被子類調用。
  4. 抽象類只能用來被繼承。
  5. 抽象方法必須被子類實現。

接口

接口的做用

· 爲何須要接口?接口和抽象類的區別?

接口就是比「抽象類」還「抽象」的「抽象類」,能夠更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。

抽象類還提供某些具體實現,接口不提供任何實現,接口中全部方法都是抽象方法。接口是徹底面向規範的,規定了一批類具備的公共方法規範。(備註:java 1.8以前的接口是隻能定義抽象方法的,默認的接口方法是public abstract,通常是省略了不寫的。可是java 1.8以後接口就能夠定義非抽象的方法了)

從接口的實現者角度看,接口定義了能夠向外部提供的服務。

從接口的調用者角度看,接口定義了實現者能提供那些服務。

接口是兩個模塊之間通訊的標準,通訊的規範。若是能把你要設計的模塊之間的接口定義好,就至關於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。你們在工做之後,作系統時每每就是使用「面向接口」的思想來設計系統。

接口和實現類不是父子關係,是實現規則的關係。好比:我定義一個接口Runnable,Car實現它就能在地上跑,Train實現它也能在地上跑,飛機實現它也能在地上跑。就是說,若是它是交通工具,就必定能跑,可是必定要實現Runnable接口。

· 接口的本質探討

接口就是規範,定義的是一組規則,體現了現實世界中「若是你是…則必須能…」的思想。若是你是天使,則必須能飛。若是你是汽車,則必須能跑。若是你是好人,則必須能幹掉壞人;若是你是壞人,則必須欺負好人。

接口的本質是契約,就像咱們人間的法律同樣。制定好後你們都遵照。

面向對象的精髓,是對對象的抽象,最能體現這一點的就是接口。爲何咱們討論設計模式都只針對具有了抽象能力的語言(好比C++、Java、C#等),就是由於設計模式所研究的,實際上就是如何合理的去抽象。

區別

  1. 普通類:具體實現

  2. 抽象類:具體實現,規範(抽象方法)

  3. 接口:規範

如何定義和使用接口

聲明格式:

[訪問修飾符] interface 接口名 [extends  父接口1,父接2…] {
常量定義;  
方法定義;
}

定義接口的詳細說明:

  1. 訪問修飾符:只能是public或默認。

  2. 接口名:和類名採用相同命名機制。

  3. extends:接口能夠多繼承。

  4. 常量:接口中的屬性只能是常量,老是:public static final 修飾。不寫也是。

  5. 方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。

要點

  1. 子類經過implements來實現接口中的規範。

  2. 接口不能建立實例,可是可用於聲明引用變量類型。

  3. 一個類實現了接口,必須實現接口中全部的方法,而且這些方法只能是public的。

  4. JDK1.7以前,接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。

  5. JDK1.8後,接口中包含普通的靜態方法。

接口的使用示例

//聲明接口
interface Animal {
   public void eat();
   public void travel();
}
//使用接口
public class MammalInt implements Animal{
 
   public void eat(){
      System.out.println("Mammal eats");
   }
 
   public void travel(){
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

結果以下:

Mammal eats
Mammal travels

接口的繼承

一個接口能繼承另外一個接口,和類之間的繼承方式比較類似。接口的繼承使用extends關鍵字,子接口繼承父接口的方法。

接口徹底支持多繼承。和類的繼承相似,子接口擴展某個父接口,將會得到父接口中所定義的一切。

interface A {
    void testa();
}
interface B {
    void testb();
}
/**接口能夠多繼承:接口C繼承接口A和B*/
interface C extends A, B {
    void testc();
}
public class Test implements C {
    public void testc() {
    }
    public void testa() {
    }
    public void testb() {
    }
}

標記接口

最經常使用的繼承接口是沒有包含任何方法的接口。

標記接口是沒有任何方法和屬性的接口.它僅僅代表它的類屬於一個特定的類型,供其餘代碼來測試容許作一些事情。

標記接口做用:簡單形象的說就是給某個對象打個標(蓋個戳),使對象擁有某個或某些特權。

例如:java.awt.event 包中的 MouseListener 接口繼承的java.util.EventListener 接口定義以下:

package java.util; 

public interface EventListener {}

沒有任何方法的接口被稱爲標記接口。標記接口主要用於如下兩種目的:

  • 創建一個公共的父接口:

    正如EventListener接口,這是由幾十個其餘接口擴展的Java API,你可使用一個標記接口來創建一組接口的父接口。例如:當一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用於一個事件的代理方案。

  • 向一個類添加數據類型:

    這種狀況是標記接口最初的目的,實現標記接口的類不須要定義任何接口方法(由於標記接口根本就沒有方法),可是該類經過多態性變成一個接口類型。

面向接口編程

面向接口編程是面向對象編程的一部分。

爲何須要面向接口編程? 軟件設計中最難處理的就是需求的複雜變化,需求的變化更多的體如今具體實現上。咱們的編程若是圍繞具體實現來展開就會陷入」複雜變化」的汪洋大海中,軟件也就不能最終實現。咱們必須圍繞某種穩定的東西開展,才能以靜制動,實現規範的高質量的項目。

接口就是規範,就是項目中最穩定的東西! 面向接口編程可讓咱們把握住真正核心的東西,使實現複雜多變的需求成爲可能。

經過面向接口編程,而不是面向實現類編程,能夠大大下降程序模塊間的耦合性,提升整個系統的可擴展性和和可維護性。

面向接口編程的概念比接口自己的概念要大得多。設計階段相對比較困難,在你沒有寫實現時就要想好接口,接口一變就亂套了,因此設計要比實現難!

相關文章
相關標籤/搜索