Java繼承你要知道的三件事

更新 發佈閱讀 8 分鐘

Java的繼承概念上是很簡單的一件事,子類別會拿到父類別的屬性(field)跟方法(method),利用繼承簡化你的設計,可以在父類別上設計共同使用的屬性跟方法,子類別可以方便的繼承。

我們舉個例子,例如我有以下兩個類別簡單的類別Product 跟 DiscountProduct

public class Product {
String name;
int price;
public Product() {
}
public Product(String name, int price) {
this.name = name;
this.price = price;
}
public int getPrice() {
return price;
}
}

public class DiscountProduct {
String name;
int price;
double discount;

public DiscountProduct(String name, int price, double discount) {
this.name = name;
this.price = price;
this.discount = discount;
}
}

我們發現這兩個類別實際上是可以利用繼承來設計,因為DiscountProduct很明顯可以繼承Product,來獲得Product上的name屬性跟price屬性,簡化我們的設計

在繼承了Product後,我們可以拿掉name price屬性

vocus|新世代的創作平台

接下來進行簡單的測試,程式中我們可以很清楚的知道目前DiscountProduct程式碼中沒有name跟price屬性,但因為繼承,所以自動有了父類別給予的屬性 name跟price 以及方法getPrice()

DiscountProduct discountProduct = new DiscountProduct("西瓜",100, 0.8);
System.out.println("name = " + discountProduct.name);//繼承來的屬性
System.out.println(discountProduct.getPrice());//繼承來的方法
結果如下:
name = 西瓜
80

這裏有三件事要注意

第一個是子類別上的重複的屬性要拿掉,如果子類別name price跟父類別重複卻沒有移除,會發生什麼事呢?假設我沒有拿掉name price

public class DiscountProduct extends Product{
String name;//保留
int price;//保留
double discount;
....

利用eclipse debug 一下 DiscountProduct discountProduct = new DiscountProduct(...)後,在variable中的情況

vocus|新世代的創作平台

可以看到會有兩組name price出現在屬性中,這兩組name price,一組是DiscountPrirce自己的(屬性值為西瓜,100),另一組則是繼承至Product來的(屬性值為null跟0)。所以在繼承過程中,請記得把子類別中重複的屬性拿掉。

Intellj IDEA中透過debug則可以更明顯看到這個現象

vocus|新世代的創作平台
那在這個例子中我要如何利用程式中區分這兩組屬性呢,你可以使用this.name(西瓜) this.price(100),而繼承來的就會是super.name(null) super.price(0),如下方範例toString(),當然實務上我們通常是不會有這種需求,大多情況下只要避免發生這情況就可以了
public class DiscountProduct extends Product {
String name;
int price;
...

@Override
public String toString() {
String info = String.format("this.name: %s, this.price: %d, Super.name: %s ,Super.price: %d Discount: %.2f",
this.name, this.price, super.name,super.price, discount);//利用this跟super區分兩組屬性
return info;
}
}

第二點我們要留意的是,子類別並不會自動繼承父類別的constructor,以下方的例子來說,雖然父類別有public Product(String name, int price),但這並不屬性繼承的範圍,所以你也只能使用 DiscountProduct中有定義的constructor

DiscountProduct dp2 = new DiscountProduct("西瓜",100); // compile會有錯

第三件事情是,子類別的constructor「一定」會呼叫父類別的constructor,在一般預設沒有特別呼叫的情況下會自動呼叫super()

public class DiscountProduct extends Product {
double discount;

public DiscountProduct(String name, int price, double discount) {
super();//這行不用寫,compile會自動幫你加
this.name = name;
this.price = price;
this.discount = discount;
}

另一種就是直接註明呼叫父類別super(name,price),所以即便沒有特別註明,父類別的constructor還是會被呼叫的。

public DiscountProduct(String name, int price, double discount) {
super(name,price);
this.name = name; //可省略,因為super(name,price)有執行相對應的程式
this.price = price;//可省略,因為super(name,price)有執行相對應的程式
this.discount = discount;
}

以上的情況再搭配this()可以變得更複雜,在這裏就不再詳加展示,如果有興趣的可以在下方留言,我再找時間補上。


留言
avatar-img
漸進超負荷工程師
0會員
6內容數
介紹Java語法
2025/05/15
Java 基本資料型態:深入探討整數、浮點數與精度問題
2025/05/15
Java 基本資料型態:深入探討整數、浮點數與精度問題
2025/05/15
接下來我們要寫第一隻程式,所有語言的第一隻程式都叫HelloWorld。先跟大家介紹最簡單執行Java程式的方式。需要JDK11以上的版本。
2025/05/15
接下來我們要寫第一隻程式,所有語言的第一隻程式都叫HelloWorld。先跟大家介紹最簡單執行Java程式的方式。需要JDK11以上的版本。
2025/05/15
JDK是Java Development Kit的縮寫,簡單來說也就是Java開發的工具組。 這裏跟大家說明如何在Windows上以及Mac上安裝JDK
Thumbnail
2025/05/15
JDK是Java Development Kit的縮寫,簡單來說也就是Java開發的工具組。 這裏跟大家說明如何在Windows上以及Mac上安裝JDK
Thumbnail
看更多
你可能也想看
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
Thumbnail
此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News