【從零開始學Java筆記】繼承

来源:https://www.cnblogs.com/zllk/archive/2020/04/07/12656964.html
-Advertisement-
Play Games

大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 什麼是繼承? 繼承就是子類繼承父類的特征和行為,使得子類 ...


大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。

【從零開始學Java筆記】目錄

什麼是繼承?

繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

簡單的說就是多個類有相同的成員變里和成員方法,為了避免代碼的重覆,可以先寫一個父類,包含共同的屬性,然後再由子類繼承。

關鍵字:extends

下麵舉個例子:

  1. 不使用繼承
class GuanYu{
	String name;
	int age;
	String address;
	
	public void win() {
		System.out.println("關羽贏了!");
	}
	
	public void lose() {
		System.out.println("關羽輸了!");
	}
}

class LvBu{
	String name;
	int age;
	String address;
	
	public void win() {
		System.out.println("呂布贏了!");
	}
	
	public void lose() {
		System.out.println("呂布輸了!");
	}
}

可以看出無論是關羽還是呂布都擁有成員變數:姓名,年齡和地址成員方法:贏和輸。如果想寫一百個武將,十分繁瑣。所以使用繼承,寫一個父類,先尋找他們的共性,那就是他們都是人,所以寫一個people類,包含他們共同的屬性和方法。如下:

class Person{
	
	String name;
	int age;
	String address;
	
	public void win() {
		System.out.println("關羽贏了!");
	}
	
	public void lose() {
		System.out.println("關羽輸了!");
	}
}
class GuanYu extends Person{
	
}

class LvBu extends Person{
	
}

Java中維承的特點

  • Java語言只支持單一繼承,只能繼承一個父類(一個兒子只能有一個親爹)
    Java語言支持多層繼承(一個兒子可以有一個親爹, 還可以有一個親爺爺)

繼承中成員變數的特點

  • 子類只能獲取父類非私有成員
    子父類中成員變數的名字不一樣 直接獲取父類的成員變里
    子父類中成員變數名字是一樣的獲取的是子類的成員變數
class GuanYu{
	private String wifeName = "null";
	String name = "GuanYu";
	
}

class GuanXing extends GuanYu{
	String name = "GuanXing";//如果沒有這句,show()輸出GuanYu
	
	public void show() {
//		System.out.println(wifename); 子類無法繼承父類的私有變數,報錯
		System.out.println(name);//輸出GuanXing
	}

給大家出一道題,大家思考一下三個輸出語句的結果,如果能理解基本上就沒什麼問題了
這裡為大家補充一個就近原則:誰離我近我就用誰
如果有局部變數就使用局部變數
如果沒有局部變數,有子類的成員變數就使用子類的成員變數
如果沒有局部變數和子類的成員變數,有父類的成員變數就使用父類的成員變數
啥都沒有,出錯了! ! !|

class GuanYu{
	
	String name = "關羽";
	
}

class GuanXing extends GuanYu{
	String name = "關興";
	public void show() {
		String name = "關平";
		
		System.out.println(name);
		System.out.println(this.name);
		System.out.println(super.name);
}

super :可以獲取父類的成員變數和成員方法
this:可以獲取當前類的成員變數和成員方法

輸出結果
關平
關興
關羽

繼承中成員方法的特點

和成員變數相似

  • 子類中沒有這個方法,調用父類的
    子類中重寫了這個方法,調用子類的

重寫和重載的區別
方法的重寫:在子父類當中,子類的方法和父類的完全一樣,子類重寫了父類的方法(覆蓋),當子類重寫了父類的方法之後,使用子類對象調用的就是子類的方法
方法的重載:在一個類中,有多個重名的方法,但是其參數不一樣(參數的個數,參數的類型,參數的順序),和返回值無關

方法重寫的應用場景

  • 當父類的方法不能完全滿足子類使用,這個時候子類重寫父類的方法
    並可以在方法中使用關鍵字super調用父類的方法,這樣做即可以保有父類的功能,也可以擁有子類持有的功能

這裡給大家舉個例子

class GuanYu{
	public void attack() {
		System.out.println("拖刀");
	}
}

class GuanXing extends GuanYu{
	public void attack() {
		super.attack();
		System.out.println("斬");
	}

其實很簡單,關興繼承了父親的攻擊方式,但是在拖刀的前提下加入了斬,使威力更強。這裡為什麼使用super.attack()為什麼不直接複製過來,這裡可以想象拖刀是一個很複雜的過程,但是我們這裡簡寫,如果關羽攻擊的函數有1000行代碼,調用比複製更方便,也更好看。

方法重寫的註意事項

不能重寫父類私有的方法
許可權必須大於等於父類方法的許可權(瞭解即可)

註解: @ 一般寫在方法、變數、類前面,用來描述方法、變數、類,目的是提高代碼規範

還用剛纔那個例子

class GuanYu{
	public void attack() {
		System.out.println("拖刀");
	}
}

class GuanXing extends GuanYu{
//	public void attck() {
//		super.attack();
//		System.out.println("斬");
//	}
	public void attack(String a) {
		super.attack();
		System.out.println("斬");
	}

如果我們給子類的方法加一個形參 string a ,或者錯寫成attck()並不會報錯,但是這個已經不算是方法的重寫了

這時候我們在重寫的代碼前加上@Override,就會報錯。

繼承中構造方法的執行順序

public class ExtendsDemo2 {
	public static void main(String[] args) {
		GuanYu gy = new GuanYu();
		System.out.println("****************");
		GuanXing gx = new GuanXing();
		
	}
	

}

class GuanYu{

	public GuanYu() {
		System.out.println("這是關羽的無參構造");
	}
	public GuanYu(int a) {
		System.out.println("這是關羽的有參構造");
	}
	
}

class GuanXing extends GuanYu{
	public GuanXing() {
		System.out.println("這是關興的無參構造");
	}
	public GuanXing(int a) {
		System.out.println("這是關興的有參構造");
	}
	
}

輸出結果

這是關羽的無參構造
****************
這是關羽的無參構造
這是關興的無參構造

為什麼調用子類的無參構造的時候,也會調用父類的無參構造?
在有子父類繼承關係的類中,創建子類的對象,調用子類的構造方法,如果子類構造方法的第一行代碼沒有調用父類的構造方法,則會預設的調用父類的無參構造

我們可以使用super( )在子類構造方法的第一行中調用父類的構造方法

class GuanXing extends GuanYu{
	public GuanXing() {
		//super(1);  //測試1
		//this(2); //測試2
		System.out.println("這是關興的無參構造");
	}
	public GuanXing(int a) {
		System.out.println("這是關興的有參構造");
	}

可以分別取消測試1和測試2的註釋,再運行,看看結果。

為什麼會有這個設定呢?因為必須先執行父類的構造,要先給父類的成員變里進行初始化,子類可能會使用到。

this和super的區別

this:當前對象的引用
調用子類的成員變數
調用子類的成員方法
在子類的構造方法第一行調用子類其他構造方法
super:子類對象的父類引用
調用父類的成員變數
調用父類的成員方法
在子類的構造方法第一行調用父類的構造方法

繼承的優缺點

優點

  • 提高了代碼的復用性
  • 提高了代碼的可維護性

缺點

  • 類的耦合性增強了
  • 開發的原則:高內聚低耦合
  • 內聚:就是自己完成某件事情的能力
  • 耦合:類與類的關係

通俗易懂的來說就是繼承可以只通過修改父類的屬性來實現子類屬性的同步修改,這樣會很方便。例如,奧迪,寶馬都是汽車的子類,如果想讓所有品牌汽車的價格增加15%,只需要再父類裡面進行操作即可。但是同時也會出現問題,父類的屬性進行修改,子類的屬性必定進行修改,但有時或出現錯誤。例如刪掉增加15%的價格,所有的品牌都會自動刪除,如果有一些其他和價格有關的方法就會出現錯誤。其實這樣就是高耦合的表現,類與類之間關係十分緊密,牽一發而動全身。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Linux中,我們一般將環境變數信息配置到不同的文件中,常用的配置文件有 /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc ~/.bash _logout 上面幾個配置主要是在互動式登錄Shell和互動式非登錄Shell有區別,會載入不同的配置。 ...
  • 筆者:風起怨江南 出處:https://www.cnblogs.com/mengjinxiang 筆者原創,文章歡迎轉載,如果喜歡請點贊+關註,感謝支持! 前言:最近一直在其他博客論壇上寫Python的相關技術博客->https://blog.csdn.net/JackMengJin,計劃還是在博客 ...
  • 2019python之年: 2019是個挫折之年,但又是幸運之年,這一年創業遭遇滑鐵盧,幾與破產,充滿著迷茫,路在何方?? 開始接觸python是在微信朋友圈,結緣於廣告,覺得很有意思,但一直沒有深入接觸,後來在機緣巧合下,在各方壓迫之下,於8月份決心開始學習python, 萬事開頭難,但決心已定, ...
  • 隊列 隊列是用數組或鏈表實現的,遵循先進先出規則的一個有序列表 使用數組模擬隊列 分析:雖然隊列中的元素已經全部出隊,但是由於我們的隊列是使用數組模擬的,而且每次入隊的時候,頭指定都後移,當我們入隊次數增加,總有一時刻,頭指針指向數組最大下標,儘管我們有出隊,但是任然不能入隊元素,我們可以使用數組模 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 首先要聲明一點,無論什麼語言都沒有高低貴賤之分,語言只是 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 這裡的Java基礎並不是真正的Java基礎,而是一些無法 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Java語言是一種面向對象的程式設計語言,而面向對象思想 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 封裝概述 面向對象三大特征之一。 面向對象編程語言對客觀 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...