首頁 > 軟體

Java由淺入深帶你精通繼承super

2022-03-22 19:00:37

什麼是繼承

物件導向的特徵:

封裝:不必要公開的資料成員和方法,使用private關鍵字進行修飾。意義:安全性。

背景

程式碼中建立的類, 主要是為了抽象現實中的一些事物(包含屬性和方法).

有的時候客觀事物之間就存在一些關聯關係, 那麼在表示成類和物件的時候也會存在一定的關聯

例如, 設計一個類表示動物

注意,:我們可以給每個類建立一個單獨的 java 檔案. 類名必須和 .java 檔名匹配(大小寫敏感).

class Dag {
    public String name;
    public int age;
 
    public void eat(){
        System.out.println("eat()");
    }
 
}
class Bird{
    public String name;
    public int age;
    public String wing;
 
    public void eat(){
        System.out.println("eat()");
    }
 
    public void fly(){
        System.out.println("fly");
 
    }

定義了兩個類,一個是Dag類,一個是Bird類

對比一下上述的兩個類:

我們會發現它們之間有一些共性,我們就可以把他們相同的地方抽象出來重新定義一個類:

class Animal{
    public String name;
    public int age;
 
    public void eat(){
        System.out.println("eat()");
    }
}
class Dag {
    public String name;
    public int age;
 
    public void eat(){
        System.out.println("eat()");
    }
 
}
class Bird{
    public String name;
    public int age;
    public String wing;
 
    public void eat(){
        System.out.println("eat()");
    }
 
    public void fly(){
        System.out.println("fly");
 
    }
    
}

 這三個類都具備一個相同的 eat 方法, 而且行為是完全一樣的.

這三個類都具備一個相同的 name 屬性, 而且意義是完全一樣的.

從邏輯上講, Dag 和 Bird 都是一種 Animal.

此時我們就可以讓 Dag 和 Bird 分別繼承 Animal 類, 來達到程式碼重用的效果

此時, Animal 這樣被繼承的類, 我們稱為 父類別 , 基礎類別 或 超類, 對於像Dag 和 Bird 這樣的類, 我們稱為 子類, 派生類 和現實中的兒子繼承父親的財產類似, 子類也會繼承父類別的欄位和方法, 以達到程式碼重用的效果.

語法規則

基本語法:

class 子類 extends 父類別 {

}

使用 extends 指定父類別

Java 中一個子類只能繼承一個父類別 (而C++/Python等語言支援多繼承)

子類會繼承父類別的所有 public 的欄位和方法

對於父類別的 private 的欄位和方法, 子類中是無法存取的

子類的範例中, 也包含著父類別的範例. 可以使用 super 關鍵字得到父類別範例的參照

對於上面的程式碼, 可以使用繼承進行改進. 此時我們讓 Dag 和 Bird 繼承自 Animal 類, 那麼 Dag 在定義的時候就不必再 寫 name 欄位和 eat 方法. 

class Animal{
    public String name;
    public int age;
 
    public void eat(){
        System.out.println("eat()");
    }
}
class Dag extends Animal {
 
 
}
class Bird extends Animal{
 
    public String wing;
 
    public void fly(){
        System.out.println("fly");
 
    }
 
}

因為子類繼承了父類別的欄位和方法,所以我們在main函數裡就這樣寫:

extends 英文原意指 "擴充套件". 而我們所寫的類的繼承, 也可以理解成基於父類別進行程式碼上的 "擴充套件".

例如我們寫的 Bird 類, 就是在 Animal 的基礎上擴充套件出了 fly 方法.

如果我們把age 改成 private, 那麼此時子類就不能存取了

因為現在age是私有的,不能在子類當中使用age

super關鍵字

子類構造的同時,要先幫助父類別來進行構造

當我們這樣寫就不報錯了,這是為什麼呢?

super三種用法://不能出現在靜態方法當中,因為super相當於父類別物件的參照

1、super():呼叫父類別的構造方法

2、super.function():呼叫父類別的普通方法

3、super.data:呼叫父類別的成員屬性

protected 關鍵字

剛才我們發現, 如果把欄位設為 private, 子類不能存取. 但是設成 public, 又違背了我們 "封裝" 的初衷. 兩全其美的辦法就是 protected 關鍵字

對於類的呼叫者來說, protected 修飾的欄位和方法是不能存取的

對於類的 子類 和 同一個包的其他類 來說, protected 修飾的欄位和方法是可以存取的

// Animal.java 
public class Animal { 
 protected String name; 
 public Animal(String name) {
        this.name = name; 
 } 
 public void eat(String food) { 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Bird.java 
public class Bird extends Animal { 
 public Bird(String name) { 
 super(name); 
 } 
 public void fly() { 
 // 對於父類別的 protected 欄位, 子類可以正確存取
 System.out.println(this.name + "正在飛 ︿( ̄︶ ̄)︿"); 
 } 
} 
// Test.java 和 Animal.java 不在同一個 包 之中了. 
public class Test { 
 public static void main(String[] args) { 
 Animal animal = new Animal("小動物"); 
 System.out.println(animal.name); // 此時編譯出錯, 無法存取 name 
 } 
} 

Java 中對於欄位和方法共有四種存取許可權

private: 類內部能存取, 類外部不能存取

預設(也叫包存取許可權): 類內部能存取, 同一個包中的類可以存取, 其他類不能存取.

protected: 類內部能存取, 子類和同一個包中的類可以存取, 其他類不能存取.

public : 類內部和類的呼叫者都能存取

final 關鍵字

曾經我們學習過 final 關鍵字, 修飾一個變數或者欄位的時候, 表示 常數 (不能修改).

final int a = 10;

a = 20; // 編譯出錯 

final 關鍵字也能修飾類, 此時表示被修飾的類就不能被繼承.

final public class Animal { 
 ... 
} 
public class Bird extends Animal { 
 ... 
} 
// 編譯出錯
Error:(3, 27) java: 無法從最終com.bit.Animal進行繼承

final 關鍵字的功能是 限制 類被繼承

"限制" 這件事情意味著 "不靈活". 在程式設計中, 靈活往往不見得是一件好事. 靈活可能意味著更容易出錯. 是用 final 修飾的類被繼承的時候, 就會編譯報錯, 此時就可以提示我們這樣的繼承是有悖這個類設計的初衷的

我們平時是用的 String 字串類, 就是用 final 修飾的, 不能被繼承

到此這篇關於Java由淺入深帶你精通繼承super的文章就介紹到這了,更多相關Java 繼承內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com