Java開發學習(4)-面向物件中的抽象類和介面學習總結

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

本文已參與「掘力星計劃」,贏取創作大禮包,挑戰創作激勵金。

我們學完Java的繼承和多型的語法和場景使用後,接著學習和了解一下抽象類和介面的相關概念和語法,以及它們有哪些特性,能在哪些應用場景中使用它們。

抽象類

抽象類是指一個類中沒有包含足夠的資訊來描繪一個具體的物件;抽象類不能例項化,但依然包含成員變數、方法和構造方法;只有被繼承才能被使用。

定義:修飾符 abstract class 類名{ // 程式碼塊 }

//定義一個抽象類 abstract class Animal{ // 成員變數 private String name; // 構造方法 public Animal(String name){ this.name = name; } // 普通方法 public void run(){ System.out.println("執行有方法體的方法"); } // 抽象方法,abstract關鍵字修飾,沒有方法體 public abstract void eat(); }

繼承抽象類

定義:修飾符 class 類名 extends 抽象類{ // 程式碼塊 }

``` public class Cat extends Animal { private String catType; public Cat(String name, String catType){ super(name); this.catType = catType; } @Override public void eat() { // TODO 實現繼承類方法 System.out.println("Cat eat()"); }

public void voice(){
    System.out.println("The voice of cat.");
}

} ```

抽象方法

如果建立一個類包含一個特別的成員方法,該方法的具體實現由它的子類確定,那你可以在父類中宣告該方法為抽象方法。

定義:修飾符 abstract 返回值型別 方法名();

注意:一個類包含抽象方法,該類必須是抽象類;任何子類必須重寫父類的抽象方法,或者宣告自身為抽象類。

抽象特性

  1. 抽象類不能被例項化,只有抽象類的非抽象子類可以建立物件。

  2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

  3. 抽象類中的抽象方法只宣告,不包含方法體,直接分號(;)結束。

  4. 構造方法,類方法(用 static 修飾的方法)不能宣告為抽象方法。

  5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。

介面

介面是一個抽象型別,是抽象方法的集合,不是類,是包含類要實現的方法。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。

介面無法被例項化,但是可以被實現。一個實現介面的類,必須實現介面內所描述的所有方法,否則就必須宣告為抽象類。

定義:

[修飾符] interface 介面名稱 [extends 其它的介面名] { // 宣告變數 // 抽象方法 }

// 定義介面 interface Animal { public void eat(); public void sleep(); }

介面實現和繼承

類要實現介面中所有的方法,否則類必須宣告為抽象的類。

定義:修飾符 class 類名 implements 介面名稱[, 其他介面名稱, ...] {}

``` public class Cat implements Animal { @Override public void eat() { // TODO 實現介面中 eat 方法 System.out.println("Cat eat"); }

@Override
public void sleep() {
    // TODO 實現介面中 sleep 方法
    System.out.println("Cat sleep");
}
public int hasLegs(){
  return 4;
}

public static void main(String[] args) {
    // TODO 自動生成的方法存根
    Cat cat = new Cat();
    cat.eat();
    int legs = cat.hasLegs();
    System.out.println("貓有"+ legs +"條腿");
}

} ```

規則:一個類可以同時實現多個介面;一個類只能繼承一個類,但能實現多個介面;一個介面能繼承另一個介面。

標記介面

標記介面是指繼承介面是沒有包含任何方法和屬性的介面,僅僅表明它的類屬於一個特定的型別,供其他程式碼來測試允許做一些事情。

作用:建立一個公共的父介面;向一個類新增資料型別。

介面特性

1.介面是隱式抽象的,當宣告一個介面的時候,不必使用 abstract 關鍵字;

2.介面中每一個方法也是隱式抽象的,宣告時同樣不需要 abstract 關鍵字;

3.介面中可以含有變數,但是介面中的變數會被隱式的指定為 public static final 變數

4.介面中的方法都是公共的。

介面和類的區別

1.介面不能例項化物件。

2.介面沒有構造方法。

3.介面中所有的方法必須是抽象方法,Java 8 之後 介面中可以使用 default 關鍵字修飾的非抽象方法。

4.介面不能包含成員變數,除了 static 和 final 變數。

5.介面不是被類繼承,而是要被類實現。

6.介面支援多繼承。

介面和抽象類區別

  1. 抽象類中的方法可以有方法體,能實現方法的具體功能,但是介面中的方法不行。

  2. 抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是 public static final 型別。

  3. 介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態程式碼塊和靜態方法。

  4. 一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

注:JDK 1.8 以後,接口裡可以有靜態方法和方法體了;介面允許包含具體實現的方法,該方法稱為"預設方法",預設方法使用 default 關鍵字修飾。

溫馨提示

文章內容如果寫的存在問題歡迎留言指出,讓我們共同交流,共同探討,共同進步~~~

文章如果對你有幫助,動動你的小手點個贊,鼓勵一下,給我前行的動力。

「歡迎在評論區討論,掘金官方將在掘力星計劃活動結束後,在評論區抽送100份掘金周邊,抽獎詳情見活動文章」