后端Java開發:第十三天

第十三天:繼承 - 面向對象的核心概念

歡迎來到第十三天的學習!今天,我們將深入探討 Java 中的 繼承(Inheritance),這是面向對象編程的四大基本特性之一。繼承是指一個類(子類)通過繼承另一個類(父類)的屬性和方法,從而具備父類的功能,同時可以在子類中擴展新的功能。繼承是代碼復用的核心機制之一,它有助于提高代碼的可維護性和可擴展性。

1. 什么是繼承?

繼承是面向對象編程中的一種機制,它允許我們創建一個新類(子類),這個新類可以繼承一個已有類(父類)的一些特性(字段)和行為(方法)。通過繼承,子類可以復用父類的代碼,同時還可以根據需要擴展或重寫父類的方法。

繼承的基本原則:

  • 子類繼承父類:子類繼承了父類的屬性和方法,并且可以在子類中新增屬性和方法。
  • 方法重寫(Overriding):子類可以重新定義父類的某些方法。
  • 單繼承:Java 中的類是單繼承的,也就是說,每個類只能有一個直接父類。

2. 繼承的好處

繼承有以下幾個重要的好處:

  • 代碼復用:繼承讓我們能夠復用父類的代碼,避免了重復編寫相同的代碼。
  • 增強可維護性:由于子類共享父類的代碼,如果父類發生了變化,只需要修改父類代碼,子類無需改變,從而提高了代碼的可維護性。
  • 擴展性:通過繼承,我們可以在子類中擴展新的功能,或者重寫父類的方法,實現特定需求。

3. 如何實現繼承?

在 Java 中,繼承的實現通過使用 extends 關鍵字。子類通過 extends 關鍵字繼承父類的屬性和方法。

基本語法
public class 子類 extends 父類 {// 子類特有的屬性和方法
}
步驟 1:定義父類

首先定義一個父類,包含一些屬性和方法。

步驟 2:定義子類

子類通過 extends 關鍵字繼承父類的屬性和方法。子類可以使用父類的屬性和方法,也可以添加自己獨特的屬性和方法。

步驟 3:使用父類的構造方法

父類的構造方法可以通過 super() 來調用,子類構造方法可以通過 super 關鍵字來調用父類的構造器,確保父類的初始化過程。


4. 繼承的示例

示例 1:動物類與狗類

在這個例子中,我們有一個 動物類(Animal),它包含基本的屬性和行為,然后我們通過繼承創建一個 狗類(Dog),它繼承了動物類的屬性,并擴展了自己特有的方法。

// 父類:Animal
public class Animal {private String name;// 父類構造方法public Animal(String name) {this.name = name;}// 父類方法public void speak() {System.out.println("Animal makes a sound");}public String getName() {return name;}
}// 子類:Dog
public class Dog extends Animal {// 子類構造方法public Dog(String name) {super(name); // 調用父類的構造方法}// 子類重寫父類方法@Overridepublic void speak() {System.out.println(getName() + " barks");}public static void main(String[] args) {// 創建子類對象Dog dog = new Dog("Buddy");dog.speak();  // 輸出:Buddy barks}
}

輸出

Buddy barks

分析

  • Dog 繼承了 Animal 類,獲得了父類的 name 屬性和 speak() 方法。
  • Dog 重寫了父類的 speak() 方法,使其表現為 “bark”(叫聲)。
  • 子類 Dog 使用 super(name) 調用了父類的構造方法來初始化 name 屬性。
示例 2:形狀類與圓形類

我們再來看一個簡單的圖形類的例子。假設我們有一個 Shape 類作為父類,代表一個普通的形狀。然后我們可以創建一個 Circle 類繼承 Shape,表示圓形。

// 父類:Shape
public class Shape {private String color;public Shape(String color) {this.color = color;}public void draw() {System.out.println("Drawing a shape");}public String getColor() {return color;}
}// 子類:Circle
public class Circle extends Shape {private double radius;// 子類構造方法public Circle(String color, double radius) {super(color);  // 調用父類的構造方法this.radius = radius;}// 子類方法public void draw() {System.out.println("Drawing a circle with radius " + radius);}public static void main(String[] args) {// 創建子類對象Circle circle = new Circle("Red", 5.0);circle.draw();  // 輸出:Drawing a circle with radius 5.0}
}

輸出

Drawing a circle with radius 5.0

分析

  • Circle 類繼承了 Shape 類,繼承了 color 屬性和 draw() 方法。
  • Circle 類通過 super(color) 調用了父類的構造方法。
  • Circle 類重寫了 draw() 方法,以實現繪制圓形的特定行為。

5. 方法重寫(Method Overriding)

在繼承中,子類可以重寫(Override)父類的方法。這是一個非常重要的概念,它允許子類在繼承父類的基礎上修改方法的實現,使其行為符合子類的需求。

重寫的規則
  • 子類的方法必須與父類的方法具有相同的名稱、返回類型和參數列表。
  • 子類的方法可以有不同的實現。
  • 子類的方法不能減少父類方法的訪問權限(即如果父類方法是 public,子類不能將其變為 private)。
重寫示例
class Animal {public void sound() {System.out.println("Some generic animal sound");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Bark");}
}public class Test {public static void main(String[] args) {Animal animal = new Animal();Dog dog = new Dog();animal.sound();  // 輸出:Some generic animal sounddog.sound();     // 輸出:Bark}
}

輸出

Some generic animal sound
Bark

分析

  • Dog 類重寫了 sound() 方法,定義了自己特有的行為。
  • 當調用 dog.sound() 時,輸出了 Bark,而不是父類的通用行為。

6. 繼承的常見誤區

誤區 1:在子類中隨意改變父類的方法實現

繼承的目的并不是為了隨意修改父類的實現,而是讓子類通過重寫父類的方法來增強或改變功能。

誤區 2:繼承層級過深

繼承層級過深會導致代碼難以維護和理解。盡量避免過度繼承,使用組合(composition)來代替繼承,減少類的層次結構。


7. 總結

今天我們學習了 繼承(Inheritance),它是面向對象編程中最基礎也是最重要的特性之一。通過繼承,子類可以復用父類的代碼,擴展父類的功能,并在需要時重寫父類的方法。繼承幫助我們減少代碼的重復,提高代碼的可維護性和可擴展性。

繼承是構建 Java 程序的重要工具,但在使用時要注意避免過度繼承,并合理設計類的層次結構。

明天我們將繼續學習 面向對象編程的其他特性——多態(Polymorphism)。敬請期待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65383.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java項目之網上租貿系統源碼(springboot+mysql+vue)

風定落花生,歌聲逐流水,大家好我是風歌,混跡在java圈的辛苦碼農。今天要和大家聊的是一款基于springboot的網上租貿系統。項目源碼以及部署相關請聯系風歌,文末附上聯系信息 。 項目簡介: 基于Spring Boot的網上租貿…

協方差矩陣

協方差矩陣是一個對稱矩陣,用來描述多個隨機變量之間的協方差關系。協方差反映了兩個隨機變量如何共同變化的趨勢,協方差矩陣將這種關系擴展到了多維數據。 1. 定義 假設有一個 n 維隨機向量 ,協方差矩陣 Σ 定義為: 其中&#…

spring boot controller放到那一層

在 Spring Boot 應用程序中,Controller 層通常被放置在應用程序的 表示層(Presentation Layer) 或 用戶界面層(UI Layer) 中。Controller 層的主要職責是處理用戶的 HTTP 請求,并將請求轉發給服務層進行業務…

計算機網絡之---局域網

什么叫局域網 局域網(LAN,Local Area Network) 是指在一個相對較小的區域內,如家庭、辦公室、學校、企業等,連接多個計算機和設備的網絡。局域網的特點是覆蓋范圍小、傳輸速度快、構建成本較低。 局域網的主要特點&…

Spring Boot + Jasypt 實現application.yml 屬性加密的快速示例

Jasypt(Java Simplified Encryption)是一個專為Java應用程序設計的開源加密庫,旨在簡化加密和解密流程,保護敏感數據如密碼、API密鑰等。 jasypt-spring-boot-starter允許開發者在Spring Boot應用中輕松地實現加密和解密功能。 本篇介紹使用 jasypt-spring-boot-starter 以…

HarmonyOS開發:傳參方式

一、父子組件傳參 1、父傳子(Prop方式) 父組件代碼 Entry Component struct ParentComponent {State parentMessage: string Hello from Parent;build() {Column() {ChildComponent({ message: this.parentMessage });}} } 子組件代碼 Component s…

deepin系統下開放指定端口

一、安裝ufw 若已安裝則跳過 sudo apt-get install ufw二、查看防火墻狀態 sudo ufw status三、打開防火墻 sudo ufw enable四、開放端口 sudo ufw allow 6654/tcp五、windows下測試遠程端口 telnet 192.168.1.22 6654六、關閉防火墻 sudo ufw disable附上ufw的全部命令…

微信小程序中使用 TypeScript 定義組件時,Component 函數確實需要多個類型參數

在微信小程序中使用 TypeScript 定義組件時,Component 函數確實需要多個類型參數,而不僅僅是一個。這些參數包括: Properties:組件的屬性(props)類型。 Data:組件的內部數據類型。 Methods&am…

我在廣州學 Mysql 系列——與索引相關的練習題

??大家好,我是練小杰,今天星期二啦,還有三天就是星期五了,為了美好生活奮斗吧朋友們! 本文將學習MYSQL中數據表內容的索引相關練習題目~~ 復習:👉【索引詳解】 數據庫專欄👉【數據…

通過 route 或 ip route 管理Linux主機路由

目錄 一:route 使用說明1、查看路由信息2、刪除指定路由3、增加指定路由 二:ip route 使用說明1、查看主機路由2、新增主機路由3、刪除主機路由 通過route 或者ip route修改Linux主機路由后屬于臨時生效,系統重啟后就恢復默認值了&#xff0c…

SASS 簡化代碼開發的基本方法

概要 本文以一個按鈕開發的實例,介紹如何使用SASS來簡化CSS代碼開發的。 代碼和實現 我們希望通過CSS開發下面的代碼樣式,從樣式來看,每個按鈕的基本樣式相同,就是顏色不同。 如果按照傳統的方式開發,需要開發btn &…

我用Ai學Android Jetpack Compose之Button

答案來自 通義千問,代碼同樣需要到Android Studio里實踐,才能學會。完整工程代碼見文末。 我要學Button,麻煩介紹一下 當然可以!Button 是 Jetpack Compose 中用于創建可點擊按鈕的 Composable 函數。它提供了豐富的配置選項來定…

flutter 專題三十六 Flutter動態化框架Thresh

一、前言 移動端技術棧自誕生以來,其雙端開發成本和發布效率一直廣受詬病。為了解決這些問題,前端跨端技術一直在不斷嘗試,希望能一次開發、多端運行并且能做到快速發布。期間經歷了多個技術發展階段。 第一階段:以H5為代表&…

NodeJs 箭頭函數:`()=>{}` 和 `()=>()` 的區別與使用場景

在 JavaScript 中,箭頭函數(Arrow Function)是一種簡潔的函數寫法,它不僅可以減少代碼量,還能避免 this 綁定的問題。然而,箭頭函數有兩種常見的寫法:()>{} 和 ()>()。這兩種寫法雖然看起…

緩存-Redis-緩存更新策略-主動更新策略-Cache Aside Pattern(全面 易理解)

**Cache-Aside Pattern(旁路緩存模式)**是一種廣泛應用于緩存管理的設計模式,尤其在使用 Redis 作為緩存層時尤為常見。該模式通過在應用程序與緩存之間引入一個旁路,確保數據的一致性和高效性。本文將在之前討論的 Redis 主動更新…

python制作翻譯軟件

本文復刻此教程:制作屬于自己的翻譯軟件-很簡單【Python】_嗶哩嗶哩_bilibili 一、明確需求(以搜狗翻譯為例) (1)網址:https://fanyi.sogou.com/text (2) 數據:翻譯內容…

【C++】20.二叉搜索樹

文章目錄 1. 二叉搜索樹的概念2. 二叉搜索樹的性能分析3. 二叉搜索樹的插入4. 二叉搜索樹的查找5. 二叉搜索樹的刪除6. 二叉搜索樹的實現代碼7. 二叉搜索樹key和key/value使用場景7.1 key搜索場景:7.2 key/value搜索場景:7.3 主要區別:7.4 ke…

vue3探索——使用ref與$parent實現父子組件間通信

在vue3中,可以使用vue3的API defineExpose()函數結合ref或者$parent,實現父子組件數據的傳遞。 子組件向父組件傳遞數據defineExpose()和ref 子組件:通過defineExpose() 函數,向外暴露響應式數據或者方法 // src/components/son…

Opencv圖片的旋轉和圖片的模板匹配

圖片的旋轉和圖片的模板匹配 目錄 圖片的旋轉和圖片的模板匹配1 圖片的旋轉1.1 numpy旋轉1.1.1 函數1.1.2 測試 1.2 opencv旋轉1.2.1 函數1.2.2 測試 2 圖片的模板匹配2.1 函數2.2 實際測試 1 圖片的旋轉 1.1 numpy旋轉 1.1.1 函數 np.rot90(kl,k1),k1逆時針旋轉9…

重溫設計模式--13、策略模式

策略模式介紹 文章目錄 策略模式介紹C 代碼示例 策略模式是一種行為設計模式,它允許在運行時選擇算法的行為。該模式將算法的定義和使用分離開來,使得算法可以獨立于使用它的客戶端而變化,提高了代碼的靈活性和可維護性。 其主要包含以下幾個…