Java開發學習(4)-面向物件中的抽象類和介面學習總結
小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。
本文已參與「掘力星計劃」,贏取創作大禮包,挑戰創作激勵金。
我們學完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 返回值型別 方法名();
注意:一個類包含抽象方法,該類必須是抽象類;任何子類必須重寫父類的抽象方法,或者宣告自身為抽象類。
抽象特性
-
抽象類不能被例項化,只有抽象類的非抽象子類可以建立物件。
-
抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
-
抽象類中的抽象方法只宣告,不包含方法體,直接分號(;)結束。
-
構造方法,類方法(用 static 修飾的方法)不能宣告為抽象方法。
-
抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。
介面
介面是一個抽象型別,是抽象方法的集合,不是類,是包含類要實現的方法。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
介面無法被例項化,但是可以被實現。一個實現介面的類,必須實現介面內所描述的所有方法,否則就必須宣告為抽象類。
定義:
[修飾符] 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.介面支援多繼承。
介面和抽象類區別
-
抽象類中的方法可以有方法體,能實現方法的具體功能,但是介面中的方法不行。
-
抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是 public static final 型別。
-
介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態程式碼塊和靜態方法。
-
一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。
注:JDK 1.8 以後,接口裡可以有靜態方法和方法體了;介面允許包含具體實現的方法,該方法稱為"預設方法",預設方法使用 default 關鍵字修飾。
溫馨提示
文章內容如果寫的存在問題歡迎留言指出,讓我們共同交流,共同探討,共同進步~~~
文章如果對你有幫助,動動你的小手點個贊,鼓勵一下,給我前行的動力。
「歡迎在評論區討論,掘金官方將在掘力星計劃活動結束後,在評論區抽送100份掘金周邊,抽獎詳情見活動文章」