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屬性

raw-image

接下來進行簡單的測試,程式中我們可以很清楚的知道目前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中的情況

raw-image

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

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

raw-image
那在這個例子中我要如何利用程式中區分這兩組屬性呢,你可以使用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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
Thumbnail
此章節旨在介紹Java程式語言中的各種資料型別,包括基本型別、引用型別、集合型別、陣列型別、字典型別等。它還講解了如何在Java中進行型別轉換和自定義型別,並提供了相關的程式碼示例。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News