從零開始的Java程式設計之抽象與介面

Shadowlazy發表於2020-10-20

一、抽象類:

定義抽象方法:

  • [修飾符] abstract 返回值型別 方法名([引數列表]); //抽象方法
  1. 概念:

    抽象類和具體類是相對概念,抽象是一種存在思想邏輯中的概念,而具體是一種可見可觸控的現實物件。比如說,男人抽象一點,生物更抽象。

    抽象的概念是由具體概念依其共性而產生的,把具體概念的諸多個性排除,集中的描述其共性,就會產生一個抽象的概念。

    抽象高於具體,但是需要具體來實現抽象。

    抽象的外延伸大,內涵小,而具體的外延小,內涵大。

  2. 抽象類與普通類:

    普通類可以例項化呼叫;抽象類不能被例項化。因為它是一種概念而不是具體。

    普通類和抽象類都可以被繼承,但抽象類被繼承後,需要子類重寫繼承的方法。除非子類也是抽象類。

    演示:

    public class pet{
     public void play(){} // Pet類,普通父類,方法裡是空的
    }
    ----------------------
    public class Cat extends Pet{ // 貓類子類,重寫父類方法
     public void play(){
         System.out.println("1、貓爬樹");
     }
    }
    ----------------------
    public class Dog extends Pet {    //這是子類,是一個狗類,重寫了父類方法
    	public void play(){
    	System.out.println("2、狗啃骨頭");
    	}
    }
    ----------------------
    public class Test {
    public static void main(String[] args) {  //這是測試類,分別呼叫了子類的不同方法
    
    Pet p1=new Cat();  //多典型的多型表現     
    Pet p2=new Dog();
    
    p1.play();
    p2.play();
    }
    }
    ----------------------
    輸出結果:
    1、貓爬樹
    2、狗啃骨頭
    ----------------------
     
    //抽象方法
    public abstract class Pet{
     
     //抽象方法
     public abstract void run();//沒有方法體,沒有大括號
    }
    

    上述程式碼若改成抽象父類,其子類的寫法依舊不變,那麼抽象類的存在意義是什麼?

    抽象類就是為了強制不能例項化,定義一種規則。

  3. 抽象類的特點:

    • 抽象類,抽象方法有 abstract 修飾
    • 抽象方法沒有方法體
    • 抽象方法不能執行
    • 抽象方法不能用private修飾
    • 抽象類中可以有普通方法
    • 如果一個類繼承了抽象類,那這個類必須重寫它的抽象方法或者將類宣告為抽象類
    • 抽象類是有構造方法的,但是不能被例項化
    • 構造方法,類方法(static)不能宣告為抽象方法
    • 一個類中只要含有抽象方法,這個類就必須是抽象類;抽象類不一定含有抽象方法

    若抽象類中有非抽象方法,繼承這個抽象類中的子類可以直接使用此非抽象方法(前提是能訪問到)

二、介面

定義介面

[修飾符] interface 介面名{}

public interfacae USB{
public static final name = ""; //靜態常量

	public void service();
}

介面中的方法預設是抽象方法,所以省略abstract修飾符

介面中的方法預設都是public,所以可以省略public

介面中的變數只能是靜態常量(static final),所以可以省略 static final,靜態常量在定義時就需要賦值,且不可變

介面使用和抽象類一樣,都是通過子類

一個類可以實現多個介面,介面之間使用 , 隔開

介面的實現類中,可以有普通方法

實現的方法必須是 public 的

java 中繼承是單繼承,使用 extends 關鍵字;但是一個類可以實現多個介面,使用 implements ,多個 介面之間用 , 隔開。

一個類可以同時繼承和實現介面, extends 要在 implements 之前

public class LenovoComputer extends Computer implements USBInterface, ChargeInterface{
}

介面與介面之間是繼承關係,使用 extends 關鍵字。多個介面使用 , 隔開

public interface USBC extends USBInterface,ChargeInterface{
}
  • jdk8介面新特性

    靜態方法必須寫方法體,jdk1.8新增,default修飾符修飾的方法要加方法體,不寫修飾符預設是public,所以要寫方法體的話必須加static

    public interface USBInterface {
        public static void test1() {
            System.out.println("test1");
            }
    }
    
  
  

三、抽象類與介面

  1. 概念:

    介面是對動作的抽象,抽象類是對本質的抽象

    抽象類表示的是,這個物件是什麼,介面表示的是,這個物件能做什麼。比如男人和女人,他們的抽象類是人類,而貓和狗的抽象類是寵物類。人類可以吃東西,寵物類也可以吃東西,但是兩者不能混為一談,因為有本質上的區別。吃東西是一個動作,你可以把吃東西定義為一個介面,然後讓兩個類去實現他。

    所以,在高階語言上,一個類只能繼承一個類或抽象類,正如人不可能同時是動物類又是植物類,但是可以實現多個介面,例如,吃飯介面、呼吸介面等

  2. 使用情況

    • 抽象類 和 介面 都是用來抽象具體物件,但是介面的抽象級別最高。
    • 抽象類可以有具體的方法和屬性,介面只能有抽象方法和不可變常量(final)。
    • 抽象類主要用來抽象類別,介面主要用來抽象功能。
    • 抽象類中不包含任何實現,派生類必須覆蓋它們。介面中所有方法都必須是未實現的(static修飾的除外,可以有方法體)。
    • 抽象類實現介面時,介面的方法在抽象類中可以被實現也可以不被實現,而普通實現介面必須實現所有介面方法。
    • 當你關注一個事物的本質的時候,用抽象類。
    • 當你關注一個操作的時候,用介面。

四、總結:

抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度的。

相關文章