【day11】面向對象編程進階(繼承)

概述

本文深入探討面向對象編程的核心概念,包括繼承、方法重寫、thissuper關鍵字的使用,以及抽象類和方法的定義與實現。通過本文的學習,你將能夠:

  1. 理解繼承的優勢。
  2. 掌握繼承的使用方法。
  3. 了解繼承后成員變量和成員方法的訪問特點。
  4. 掌握方法重寫及其應用場景。
  5. 學會使用this關鍵字調用當前對象的成員。
  6. 學會使用super關鍵字調用父類的成員。
  7. 定義抽象方法和抽象類。
  8. 重寫抽象方法。

第一章:繼承

1. 什么是繼承

繼承是一種代碼復用機制,通過將共通代碼抽取到父類中,子類可以直接繼承父類的功能。在Java中,使用extends關鍵字實現繼承。

注意點:

  • 子類可以繼承父類的非私有成員,但不能訪問私有成員。
  • 構造方法不能被繼承。

學習繼承:

  • 應從能否“使用”的角度來學習繼承,而非“擁有”。
    在這里插入圖片描述

2. 繼承如何使用

定義一個父類,將重復代碼放入其中。然后,定義子類繼承父類,通過extends關鍵字。創建子類對象后,可以直接使用父類中的非私有成員。

public class Employee {String name;int age;public void work(){System.out.println("工作");}private void eat(){System.out.println("員工要干飯");}
}public class Teacher extends Employee{}public class Manager extends Employee{
}

3. 繼承中,成員變量和成員方法的訪問特點

成員變量
  • 不重名情況: 子類和父類可以擁有同名成員變量,但訪問時會根據對象類型決定訪問哪個變量。
public class Fu {int numFu = 100;
}public class Zi extends Fu{int numZi = 10;
}public class Test01 {public static void main(String[] args) {Fu fu = new Fu();System.out.println(fu.numFu);//父類中的numFuZi zi = new Zi();System.out.println(zi.numZi);System.out.println(zi.numFu);//繼承了父類,可以使用父類中非私有成員}
}
  • 重名情況: 當子類和父類成員變量重名時,訪問時會優先使用子類的成員變量,如果子類沒有,則訪問父類的成員變量。
public class Fu {int numFu = 100;int num = 10000;
}public class Zi extends Fu{int numZi = 10;int num = 1000;
}
成員方法
  • 方法調用:new的對象是誰,優先調用誰的方法。如果子類沒有該方法,則會尋找父類中的方法。
public class Fu {public void methodFu(){System.out.println("我是父類中的methodFu");}public void method(){System.out.println("我是父類中的method方法");}
}public class Zi extends Fu{public void methodZi(){System.out.println("我是子類中的methodZi方法");}public void method(){System.out.println("我是子類中的method方法");}
}

4. 方法的重寫

方法重寫是指子類中有一個與父類方法名和參數列表相同的方法。使用@Override注解可以檢測是否為重寫方法。

注意事項:

  1. 子類重寫父類方法之后,權限必須要保證大于等于父類權限(權限指的是訪問權限)
    public -> protected -> 默認 -> private
  2. 子類方法重寫父類方法,方法名和參數列表要一樣
  3. 私有方法不能被重寫,構造方法不能被重寫,靜態方法不能被重寫
  4. 子類重寫父類方法之后,返回值類型應該是父類方法返回值類型的子類類型
public class Fu {public void methodFu(){System.out.println("我是父類中的methodFu方法");}public void method(){System.out.println("我是父類中的method方法");}void method01(){}/* public static void method02(){}*/public Fu method03(){return null;}
}
public class Zi extends Fu{public void methodZi(){System.out.println("我是子類中的methodZi方法");}@Overridepublic void method(){System.out.println("我是子類中的method方法");}@Overridepublic void method01(){}/* public static void method02(){}*/@Overridepublic Zi method03(){return null;}
}

使用場景: 功能升級改造,子類需要對父類中已經實現好的功能進行重新改造

public class Fu {public void methodFu(){System.out.println("我是父類中的methodFu方法");}public void method(){System.out.println("我是父類中的method方法");}
}public class Zi extends Fu{public void methodZi(){System.out.println("我是子類中的methodZi方法");}@Overridepublic void method(){System.out.println("我是子類中的method方法");}
}

在這里插入圖片描述

第二章:superthis

1. 繼承中構造方法的特點

  • 當創建子類對象時,會先初始化父類,即執行父類的構造方法。
public class Fu {public Fu(){System.out.println("我是父類中的無參構造");}
}public class Zi extends Fu{public Zi(){super();System.out.println("我是子類中的無參構造");}public Zi(int i){super();System.out.println("我是子類中的有參構造");}
}

2. superthis的具體使用

super
  • 調用父類構造方法: 在子類構造方法中使用super()調用父類無參構造,或使用super(實參)調用父類有參構造。
  • 調用父類成員變量和方法: 使用super.成員變量名super.成員方法名(實參)
public class Fu {int num = 10;public Fu(){System.out.println("我是父類中的無參構造");}public Fu(int data){System.out.println("我是父類中的有參構造");}public void method(){System.out.println("我是父類中的method方法");}
}public class Zi extends Fu{int num = 100;public Zi(){super();System.out.println("我是子類中的無參構造");}public Zi(int num){super(10);System.out.println("我是子類中的有參構造");}public void method(){super.method();System.out.println("我是子類中的method方法");System.out.println(num);System.out.println(super.num);}
}
this
  • 調用當前對象的構造方法: 在構造方法中使用this()調用當前對象的無參構造,或使用this(實參)調用當前對象的有參構造。
  • 調用當前對象的成員變量和方法: 使用this.成員變量名this.成員方法名(實參)
public class Person {int num = 10;public Person(){this();System.out.println("我是Person中的無參構造");}public Person(int data){this();System.out.println("我是Person中的有參構造");}public void method(){int num = 20;System.out.println(num);System.out.println(this.num);this.method01();System.out.println("我是Person類中的method方法");}public void method01(){System.out.println("我是Person類中的method01方法");}
}

3. 繼承的特點

  • Java只支持單繼承,不支持多繼承。
  • 繼承支持多層繼承。
  • 一個父類可以有多個子類。
  • 構造方法、私有方法和靜態方法不能被繼承或重寫。

第三章:抽象

在這里插入圖片描述

1. 抽象的介紹

抽象類和抽象方法是面向對象編程中用來表達共性和多樣性的工具。抽象方法沒有具體實現,必須在子類中重寫。

關鍵字:

  • abstract用于定義抽象方法和抽象類。

注意事項:

  • 抽象方法所在的類必須是抽象類。
  • 子類必須重寫父類中的所有抽象方法,除非子類也是抽象類。
  • 抽象類不能被直接實例化,只能通過子類對象來調用重寫的方法。
public abstract class Animal {public abstract void eat();public abstract void drink();
}public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨頭");}@Overridepublic void drink() {System.out.println("狗喝水");}
}

2. 抽象的注意事項

  • 抽象類不能直接創建對象,只能創建非抽象子類的對象。
  • 抽象類中可以包含成員變量、構造方法和成員方法。
public abstract class Employee {private String name;private int age;public Employee() {}public Employee(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void work();
}

第四章:綜合案例

在這里插入圖片描述

本章節通過一個IT公司的員工體系案例,展示了如何定義類、指定繼承關系,并實現工作方法的調用。

案例描述:
某IT公司根據員工的工作內容,劃分了不同的部門和職位。每個員工都有員工編號和姓名,并執行他們負責的工作。

類的定義和繼承關系:

  • Employee:基類,包含員工編號和姓名。
  • Developer:抽象類,繼承自Employee,代表研發部員工。
  • JavaEEAndroid:具體類,繼承自Developer,代表不同的研發工程師。
  • Maintainer:抽象類,繼承自Employee,代表維護部員工。
  • NetworkHardware:具體類,繼承自Maintainer,代表不同的維護工程師。

對象創建和方法調用:
通過創建具體工程師類的對象,調用work方法,展示每個員工的工作內容。

public abstract class Employee {private int id;private String name;public Employee() {}public Employee(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void work();
}public abstract class Developer extends Employee{
}public class JavaEE extends Developer{@Overridepublic void work() {System.out.println("員工號為:"+this.getId()+"的"+this.getName()+"正在開發網站");}
}public class Android extends Developer{@Overridepublic void work() {System.out.println("員工號為:"+this.getId()+"的"+this.getName()+"正在開發app");}
}public class Test01 {public static void main(String[] args) {JavaEE javaEE = new JavaEE();javaEE.setId(1);javaEE.setName("濤哥");javaEE.work();System.out.println("===============");Android android = new Android();android.setId(2);android.setName("金蓮");android.work();}
}

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

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

相關文章

隨手記:小程序兼容后臺的wangEditor富文本配置鏈接

場景&#xff1a; 在后臺配置wangEditor富文本&#xff0c;可以文字配置鏈接&#xff0c;圖片配置鏈接&#xff0c;產生的json格式為&#xff1a; 例子&#xff1a; <h1><a href"https://uniapp.dcloud.net.cn/" target"_blank"><span sty…

6.8 Newman自動化運行Postman測試集

歡迎大家訂閱【軟件測試】 專欄&#xff0c;開啟你的軟件測試學習之旅&#xff01; 文章目錄 1 安裝Node.js2 安裝Newman3 使用Newman運行Postman測試集3.1 導出Postman集合3.2 使用Newman運行集合3.3 Newman常用參數3.4 Newman報告格式 4 使用定時任務自動化執行腳本4.1 編寫B…

工具環境 | 工具準備

搭建一套驗證環境需要的工具如下&#xff1a; 虛擬機&#xff1a;推薦virtualbox ubuntu VM好用&#xff0c;但是免費的好像木有了&#xff0c;ubuntu界面版更加容易上手。 網上找安裝教程即可&#xff0c;注意實現文件共享、復制粘貼等功能。 EDA&#xff1a;VCS Veridi 工…

計算機網絡之王道考研讀書筆記-2

第 2 章 物理層 2.1 通信基礎 2.1.1 基本概念 1.數據、信號與碼元 通信的目的是傳輸信息。數據是指傳送信息的實體。信號則是數據的電氣或電磁表現&#xff0c;是數據在傳輸過程中的存在形式。碼元是數字通信中數字信號的計量單位&#xff0c;這個時長內的信號稱為 k 進制碼…

ROS2學習配套C++知識

第3章 訂閱和發布——話題通信探索 3.3.1 發布速度控制海龜畫圓 std::bind cstd::bind綁定成員函數時&#xff0c;需要加上作用域以及取址符號 因為不會將成員函數隱式的轉換成指針&#xff0c;因此需要加&符號&#xff1b; 后面的第一個參數必須跟具體對象&#xff0c;c…

法規標準-C-NCAP評測標準解析(2024版)

文章目錄 什么是C-NCAP&#xff1f;C-NCAP 評測標準C-NCAP評測維度三大維度的評測場景及對應分數評星標準 自動駕駛相關評測場景評測方法及評測標準AEB VRU——評測內容(測什么&#xff1f;)AEB VRU——評測方法(怎么測&#xff1f;)車輛直行與前方縱向行走的行人測試場景&…

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項任務書正式賽題

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項任務書-A 目錄 一、競賽階段 二、競賽任務書內容 &#xff08;一&#xff09;拓撲圖 &#xff08;二&#xff09;模塊A 基礎設施設置與安全加固(200分) &#xff08;三&#xff09;B模塊安全事件響應/網絡安全數據取證/…

mlr3機器學習AUC的置信區間提取

如果你在mlr3拿到機器學習的預測數據 ROC 過程原理探索 假設數據 df <- data.frame(Airis$Sepal.Length, groupsample(x c(0,1),size 150,replace T)) 分組為 0,1 # 變量A為連續性變量 library(pROC) roc_obj <- roc(df g r o u p , d f group, df group,dfA, le…

Halcon例程代碼解讀:安全環檢測(附源碼|圖像下載鏈接)

安全環檢測核心思路與代碼詳解 項目目標 本項目的目標是檢測圖像中的安全環位置和方向。通過形狀匹配技術&#xff0c;從一張模型圖像中提取安全環的特征&#xff0c;并在后續圖像中識別多個實例&#xff0c;完成檢測和方向標定。 實現思路 安全環檢測分為以下核心步驟&…

Java——多線程進階知識

目錄 一、常見的鎖策略 樂觀鎖VS悲觀鎖 讀寫鎖 重量級鎖VS輕量級鎖 總結&#xff1a; 自旋鎖&#xff08;Spin Lock&#xff09; 公平鎖VS非公平鎖 可重入鎖VS不可重入鎖 二、CAS 何為CAS CAS有哪些應用 1&#xff09;實現原子類 2&#xff09;實現自旋鎖 CAS的ABA…

ubuntu18.04升級到ubuntu20.04

為了使用qt6&#xff0c;在ubuntu18.04上各種折騰失敗&#xff0c;無奈只能升級到ubuntu20.04, 按照網上的教程沒成功。自己摸索了 lsb_release -a df -h sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -y sudo apt autoremove -y sudo apt clean sudo apt inst…

【Blender】【源碼詳解】BLI_mesh_boolean 實現詳解

1. 背景&#xff1a; 最近因為項目需要&#xff0c;需要閱讀 Blender 中關于 mesh boolean 的源碼&#xff1b;因此&#xff0c;對 blender 中的 mesh boolean 源碼進行解讀&#xff1b; Github 上源碼下載很慢&#xff0c;一般使用 Gitee: gitee Blender 源碼 2. Mesh Boole…

qcow2鏡像大小壓縮

本文擬對qcow2進行壓縮進行簡單介紹 背景 qcow2鏡像在使用一段時間后&#xff0c;總是會不斷膨脹變大&#xff0c;所以在導出分享時一般都需要進行壓縮以縮減占用空間。 清除空洞 qcow2方式也有稀疏的問題&#xff0c;在磁盤級別上看&#xff0c;鏡像會有大量連續的相同空洞…

達夢 本地編碼:PG_GBK, 導入文件編碼:PG_UTF8錯誤

問題 達夢 本地編碼&#xff1a;PG_GBK, 導入文件編碼&#xff1a;PG_UTF8錯誤 解決 右鍵管理服務器 查看配置 新建一個數據庫實例&#xff0c;配置跟之前的保持一致 新建一個用戶&#xff0c;跟以前的用戶名一樣 在用戶上&#xff0c;右鍵導入&#xff0c;選擇dmp的位置 導…

深度學習卷積神經網絡CNN之MobileNet模型網絡模型詳解說明(超詳細理論篇)

1.MobileNet背景 2.MobileNet V1論文 3. MobileNett改進史 4. MobileNet模型結構 5. 特點&#xff08;超詳細創新、優缺點及新知識點&#xff09; 一、MobileNet背景 隨著移動設備的普及&#xff0c;深度學習模型的應用場景逐漸擴展至移動端和嵌入式設備。然而&#xff0c;傳統…

垂起固定翼無人機大面積森林草原巡檢技術詳解

垂起固定翼無人機大面積森林草原巡檢技術是一種高效、精準的監測手段&#xff0c;以下是對該技術的詳細解析&#xff1a; 一、垂起固定翼無人機技術特點 垂起固定翼無人機結合了多旋翼和固定翼無人機的優點&#xff0c;具備垂直起降、飛行距離長、速度快、高度高等特點。這種無…

kubernates實戰

使用k8s來部署tomcat 1、創建一個部署&#xff0c;并指定鏡像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod狀態 kubectl get pods # 獲取default名稱空間下的pods kubectl get pods --all-namespaces # 獲取所有名稱空間下的pods kubect…

數據挖掘之認識數據

在數據挖掘過程中&#xff0c;數據的認識是非常重要的一步&#xff0c;它為后續的數據分析、建模、特征選擇等工作奠定基礎。以鳶尾花數據集&#xff08;Iris Dataset&#xff09;數據集之鳶尾花數據集&#xff08;Iris Dataset&#xff09;-CSDN博客為例&#xff0c;下面將介紹…

Java 優化springboot jar 內存 年輕代和老年代的比例 減少垃圾清理耗時 如調整 -XX:NewRatio

-XX:NewRatio 是 Java Virtual Machine (JVM) 的一個選項&#xff0c;用于調整 年輕代&#xff08;Young Generation&#xff09;和 老年代&#xff08;Old Generation&#xff09;之間的內存比例。 1. 含義 XX:NewRatioN 用于指定 老年代 與 年輕代 的內存比例。 N 的含義&…

統信UOS 1071 AI客戶端接入本地大模型配置手冊

文章來源&#xff1a;統信UOS 1071本地大模型配置手冊 | 統信軟件-知識分享平臺 1. OS版本確認 1.1. 版本查看 要求&#xff1a;計算機&#xff0c;屬性&#xff0c;查看版本&#xff08;1070,構建號> 101.100&#xff09; 2. UOS AI版本確認 UOS AI&#xff0c;設置&am…