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
留言分享你的想法!
avatar-img
漸進超負荷工程師
0會員
5內容數
介紹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
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 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