
Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境搭建
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - If-else
- Java - Switch
- Java - For 迴圈
- Java - For-Each 迴圈
- Java - While 迴圈
- Java - do-while 迴圈
- Java - Break
- Java - Continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重 catch 塊
- Java - 巢狀 try 塊
- Java - Finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒連線
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路
- Java - 網路
- Java - Socket 程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - Switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 緊湊數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - 程序 API 改進
- Java - 流 API 改進
- Java - 增強的 @Deprecated 註解
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 繼承
Java 繼承
在 Java 程式設計中,繼承是 Java OOPs 的一個重要概念。繼承是一個類獲取另一個類屬性(方法 和 屬性)的過程。透過使用繼承,資訊以分層的方式進行管理。
繼承其他類屬性的類稱為子類(派生類、子類),而其屬性被繼承的類稱為超類(基類、父類)。
Java 繼承的必要性
- 程式碼重用:繼承的基本需求是重用功能。如果您已經定義了一些功能,透過使用繼承,您可以在其他類和包中輕鬆地使用它們。
- 可擴充套件性:繼承有助於擴充套件類的功能。如果您有一個具有某些功能的基類,您可以透過在派生類中使用繼承來擴充套件它們。
- 方法覆蓋的實現:實現多型性的一個概念,即方法覆蓋,需要繼承。
- 實現抽象:OOPs 的另一個概念,即抽象,也需要繼承。
Java 繼承的實現
要在 Java 中實現(使用)繼承,使用 extends 關鍵字。它將基類的屬性(屬性或/和方法)繼承到派生類。單詞“extends”表示擴充套件功能,即功能的可擴充套件性。
實現繼承的語法
請考慮以下語法在 Java 中實現(使用)繼承
class Super { ..... ..... } class Sub extends Super { ..... ..... }
Java 繼承示例
以下是一個演示 Java 繼承的示例。在此示例中,您可以觀察到兩個類,即 Calculation 和 My_Calculation。
使用 extends 關鍵字,My_Calculation 繼承了 Calculation 類的 addition() 和 Subtraction() 方法。
複製並貼上以下程式到名為 My_Calculation.java 的檔案中
實現繼承的 Java 程式
class Calculation { int z; public void addition(int x, int y) { z = x + y; System.out.println("The sum of the given numbers:"+z); } public void Subtraction(int x, int y) { z = x - y; System.out.println("The difference between the given numbers:"+z); } } public class My_Calculation extends Calculation { public void multiplication(int x, int y) { z = x * y; System.out.println("The product of the given numbers:"+z); } public static void main(String args[]) { int a = 20, b = 10; My_Calculation demo = new My_Calculation(); demo.addition(a, b); demo.Subtraction(a, b); demo.multiplication(a, b); } }
編譯並執行上述程式碼,如下所示。
javac My_Calculation.java java My_Calculation
執行程式後,將產生以下結果:
輸出
The sum of the given numbers:30 The difference between the given numbers:10 The product of the given numbers:200
在給定的程式中,當建立 My_Calculation 類的物件時,其內部會建立超類內容的副本。因此,使用子類物件可以訪問超類的成員。

超類引用變數可以儲存子類物件,但使用該變數只能訪問超類的成員,因此要訪問兩個類的成員,建議始終建立子類的引用變數。
如果您考慮上述程式,您可以如下所示例項化類。但是,使用超類引用變數(在本例中為 cal)無法呼叫屬於子類 My_Calculation 的方法 multiplication()。
Calculation demo = new My_Calculation(); demo.addition(a, b); demo.Subtraction(a, b);
注意 - 子類繼承其超類中的所有成員(欄位、方法和巢狀類)。建構函式不是成員,因此不會被子類繼承,但可以從子類呼叫超類的建構函式。
Java 繼承:super 關鍵字
super 關鍵字類似於 this 關鍵字。以下是使用 super 關鍵字的場景。
它用於區分超類的成員與子類的成員,如果它們具有相同的名稱。
它用於從子類呼叫超類的建構函式。
區分成員
如果一個類繼承了另一個類的屬性。並且如果超類的成員與子類具有相同的名稱,為了區分這些變數,我們使用 super 關鍵字,如下所示。
super.variable super.method();
示例程式碼
本節為您提供了一個演示 super 關鍵字用法的程式。
在給定的程式中,您有兩個類,即 Sub_class 和 Super_class,它們都具有名為 display() 的方法,但實現不同,並且變數 num 的值也不同。我們呼叫兩個類的 display() 方法並列印兩個類的變數 num 的值。在這裡您可以觀察到我們使用了 super 關鍵字來區分超類的成員與子類的成員。
複製並貼上程式到名為 Sub_class.java 的檔案中。
示例
class Super_class { int num = 20; // display method of superclass public void display() { System.out.println("This is the display method of superclass"); } } public class Sub_class extends Super_class { int num = 10; // display method of sub class public void display() { System.out.println("This is the display method of subclass"); } public void my_method() { // Instantiating subclass Sub_class sub = new Sub_class(); // Invoking the display() method of sub class sub.display(); // Invoking the display() method of superclass super.display(); // printing the value of variable num of subclass System.out.println("value of the variable named num in sub class:"+ sub.num); // printing the value of variable num of superclass System.out.println("value of the variable named num in super class:"+ super.num); } public static void main(String args[]) { Sub_class obj = new Sub_class(); obj.my_method(); } }
使用以下語法編譯並執行上述程式碼。
javac Super_Demo java Super
執行程式後,您將獲得以下結果:
輸出
This is the display method of subclass This is the display method of superclass value of the variable named num in sub class:10 value of the variable named num in super class:20
呼叫父類建構函式
如果一個類繼承了另一個類的屬性,子類會自動獲取父類的預設建構函式。但是,如果你想呼叫父類的帶引數建構函式,你需要使用 super 關鍵字,如下所示。
super(values);
示例程式碼
本節提供的程式演示瞭如何使用 super 關鍵字呼叫父類的帶引數建構函式。該程式包含一個父類和一個子類,其中父類包含一個接受整數值的帶引數建構函式,我們使用 super 關鍵字呼叫了父類的帶引數建構函式。
複製並貼上以下程式到一個名為 Subclass.java 的檔案中。
示例
class Superclass { int age; Superclass(int age) { this.age = age; } public void getAge() { System.out.println("The value of the variable named age in super class is: " +age); } } public class Subclass extends Superclass { Subclass(int age) { super(age); } public static void main(String args[]) { Subclass s = new Subclass(24); s.getAge(); } }
使用以下語法編譯並執行上述程式碼。
javac Subclass java Subclass
輸出
The value of the variable named age in super class is: 24
IS-A 關係
IS-A 是一種說法:這個物件是那個物件的一種型別。讓我們看看如何使用extends關鍵字來實現繼承。
public class Animal { } public class Mammal extends Animal { } public class Reptile extends Animal { } public class Dog extends Mammal { }
現在,根據上面的例子,在面向物件的術語中,以下為真 -
- Animal 是 Mammal 類的父類。
- Animal 是 Reptile 類的父類。
- Mammal 和 Reptile 是 Animal 類的子類。
- Dog 是 Mammal 和 Animal 類的子類。
現在,如果我們考慮 IS-A 關係,我們可以說 -
- Mammal IS-A Animal
- Reptile IS-A Animal
- Dog IS-A Mammal
- 因此:Dog IS-A Animal 也是如此
透過使用 extends 關鍵字,子類將能夠繼承父類所有屬性,除了父類的私有屬性。
我們可以透過使用 instanceof 運算子來確保 Mammal 實際上是一個 Animal。
示例
class Animal { } class Mammal extends Animal { } class Reptile extends Animal { } public class Dog extends Mammal { public static void main(String args[]) { Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
輸出
true true true
既然我們已經很好地理解了extends關鍵字,讓我們看看如何使用implements關鍵字來獲得 IS-A 關係。
通常,implements關鍵字用於類繼承介面的屬性。介面不能被類擴充套件。
示例
public interface Animal { } public class Mammal implements Animal { } public class Dog extends Mammal { }
Java 繼承:instanceof 關鍵字
讓我們使用instanceof運算子來檢查確定 Mammal 是否實際上是 Animal,以及 dog 是否實際上是 Animal。
示例
interface Animal{} class Mammal implements Animal{} public class Dog extends Mammal { public static void main(String args[]) { Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
輸出
true true true
HAS-A 關係
這些關係主要基於用法。這決定了某個類是否HAS-A某個東西。這種關係有助於減少程式碼重複和錯誤。
讓我們來看一個例子 -
示例
public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; }
這表明 Van 類 HAS-A Speed。透過為 Speed 建立一個單獨的類,我們不必將屬於 speed 的所有程式碼都放在 Van 類中,這使得可以在多個應用程式中重用 Speed 類。
在面向物件特性中,使用者不需要關心哪個物件在執行實際工作。為了實現這一點,Van 類向 Van 類的使用者隱藏了實現細節。因此,基本上發生的是使用者會要求 Van 類執行某個操作,而 Van 類會自行執行該操作或要求另一個類執行該操作。
Java 繼承的型別
在 Java 中,主要有三種類型的繼承:單一、多層和層次。Java 不支援多重和混合繼承。

需要記住的一個非常重要的點是,Java 不支援多重和混合繼承。這意味著一個類不能擴充套件多個類。因此,以下是非法的 -
1. Java 單一繼承
只有一個基類和一個派生類的繼承稱為單一繼承。單一(或單層)繼承僅從一個基類繼承資料到一個派生類。
Java 單一繼承的示例
class One { public void printOne() { System.out.println("printOne() method of One class."); } } public class Main extends One { public static void main(String args[]) { // Creating object of the derived class (Main) Main obj = new Main(); // Calling method obj.printOne(); } }
輸出
printOne() method of One class.
2. Java 多層繼承
基類被繼承到派生類,並且該派生類進一步被繼承到另一個派生類的繼承稱為多層繼承。多層繼承涉及多個基類。
Java 多層繼承的示例
class One { public void printOne() { System.out.println("printOne() method of One class."); } } class Two extends One { public void printTwo() { System.out.println("printTwo() method of Two class."); } } public class Main extends Two { public static void main(String args[]) { // Creating object of the derived class (Main) Main obj = new Main(); // Calling methods obj.printOne(); obj.printTwo(); } }
輸出
printOne() method of One class. printTwo() method of Two class.
3. Java 層次繼承
只有一個基類和多個派生類的繼承稱為層次繼承。
Java 層次繼承的示例
// Base class class One { public void printOne() { System.out.println("printOne() Method of Class One"); } } // Derived class 1 class Two extends One { public void printTwo() { System.out.println("Two() Method of Class Two"); } } // Derived class 2 class Three extends One { public void printThree() { System.out.println("printThree() Method of Class Three"); } } // Testing CLass public class Main { public static void main(String args[]) { Two obj1 = new Two(); Three obj2 = new Three(); //All classes can access the method of class One obj1.printOne(); obj2.printOne(); } }
輸出
printOne() Method of Class One printOne() Method of Class One
示例
public class extends Animal, Mammal{}
但是,一個類可以實現一個或多個介面,這幫助 Java 擺脫了多重繼承的不可能。