Java進階----繼承

繼承

一.繼承概述

繼承是可以通過定義新的類,在已有類的基礎上擴展屬性和功能的一種技術.
案例:優化 貓、狗JavaBean類的設計

狗類:Dog
屬性:名字 name,年齡 age
方法:看家 watchHome()Getter and Setter
貓類:Cat
屬性:名字 name,年齡 age
方法:抓老鼠 catchMouse(),Getter and Setter

普通寫法:

//貓類
public class Cat {private String name;private int age;public void catchMouse() {System.out.println("貓抓老鼠");}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 class Dog {private String name;private int age;public void watchHome() {System.out.println("狗看家");}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;}
}
相同的屬性,有大量重復代碼
private String name;
private int 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;}

繼承格式

繼承使用 extends 關鍵字,讓派生類擴展基類的功能。派生類也叫子類,基類也叫超類或父類

需求:使用繼承優化貓狗類的設計

  • 貓和狗都屬于動物的一種,它們的共有屬性、功能是每種動物都具備的,可將狗和貓看成是動物的擴展;
  • 定義Animal動物類,并定義貓和狗的共有內容,作為動物的基礎屬性和功能
屬性:姓名 name,年齡 age
方法:Getter and Setter
  • 分別定義Dog狗類和Cat貓類,使用繼承技術在Animal動物類的基礎功能上擴展自己的特有功能
Dog:看家 watchHome()
Cat:抓老鼠 catchMouse()

分析:
需求:使用繼承技術優化Dog和Cat類
1.思考父類是什么?(將Dog和Cat中的相同內容全部放到父類中)子類是什么?子類需要繼承父類什么?
2.先定義Animal動物類,作為Dog狗類和Cat貓類的父類
3.使用extends關鍵字讓Dog和Cat繼承Animal

// Animal動物類
public class Animal {//父類的私有內容不能直接繼承(直接使用)private String name;private int 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 class Cat extends Animal{public void catchMouse() {System.out.println("貓抓老鼠");}
}//狗類 繼承動物類
public class Dog extends Animal{public void watchHome() {System.out.println("狗看家");}
}
//測試Dog和Cat的功能是否能夠正常使用
public class Demo {public static void main(String[] args) {//需求:使用繼承技術優化Dog和Cat類Dog dog = new Dog();dog.watchHome();dog.setAge(3);int age = dog.getAge();dog.setName("小黃");Cat cat = new Cat();String name = dog.getName();System.out.println(name);System.out.println(age);}
}

小結

繼承技術的作用是什么?
可以使用___extends___關鍵字,讓子類擴展父類的屬性和功能
如何使用繼承技術?
在__父類_____中定義子類們的共有內容,作為基礎屬性和功能
讓___子類_____使用 extends__ 關鍵字,擴展父類的屬性和功能
繼承技術有什么好處?
可以提高代碼__復用率________,減少重復的代碼

拓展

什么時候使用繼承呢?

  • 子類和父類具備 is a 的關系
  • is a 的關系:

假設A和B兩個類,A是B的一種,那么A類和B類就有 is a 的關系
此時:A類 extends B類,蘋果類 extends 水果,貓類 extends 動物.

繼承案例練習

需求:在某個寵物店的寵物資源管理系統中,存在貓、狗角色。

貓類屬性(姓名,年齡),行為(喝水,抓老鼠)
狗類屬性(姓名,年齡),行為(喝水,看家)

利用繼承技術,定義貓類和狗類,并實現效果:

3歲的小貓杰克,每天都抓一只老鼠當晚餐
2歲的小狗大黃,每天都趴在門口看家護院

1.先定義Animal動物類,作為父類
2.分別定義Dog狗類和Cat貓類,作為子類
3.創建子類對象,調用功能

/***動物類:作為父類*/
public class Animal {//提取子類們共有的屬性和功能:共有的屬性:姓名、年齡private String name;private int age;
//針對被私有的屬性,需要提供Getter and Setter方法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 void drink(){System.out.println("喝水");}
}
/*** 狗類:使用extends關鍵字,繼承Animal動物類*/
public class Dog extends Animal {//特有功能:看家public void watchHome() {System.out.println(getAge() + "歲的小狗" + getName() + ",每天都趴在門口看家護院");}
}
public class Cat extends Animal {//特有功能:抓老鼠public void catchMouse() {System.out.println(getAge() + "歲的小貓" + getName() + ",每天都抓一只老鼠當晚餐");}
}
public class Test {public static void main(String[] args) {//1.先定義Animal動物類,作為父類//2.分別定義Dog狗類和Cat貓類,作為子類//3.創建子類對象,調用功能Dog dog = new Dog();dog.setName("大黃");dog.setAge(2);Cat cat = new Cat();cat.setName("杰克");cat.setAge(2);dog.watchHome();cat.catchMouse();}
}

繼承的注意事項

  1. 單繼承: 一個子類只能有一個父類
  2. 多層繼承:子類可以有父類,父類也可以有父類
  3. 繼承成員子類能從父類那直接或間接獲取屬性和功能
  4. 祖宗類:任何一個類都直接或間接的繼承Object類

分析
1.Java只能單繼承(一個子類有且僅有一個父類)
需求:嘗試讓Son類同時繼承Dad類和GrandDad類

public class GrandDad {public void drawing() {System.out.println("繪畫");}
}
//嘗試Son多繼承(同時繼承)Dad和GrandDaD類,代碼會報錯!
//public class Son extends Dad, GrandDad {
//public class Son extends Dad extends GrandDad {

2.Java雖然只能單繼承,但是可以多層繼承(子類繼承父類,但父類也可以繼續繼承父類)

  • 需求:嘗試讓Son類繼承Dad類,然后讓Dad類繼承GrandDad類
  • 創建子類Son的對象,去調用Dad類和GrandDad類的功能
//嘗試讓Son繼承Dad
public class Son extends Dad{
}
//讓Dad類繼承GrandDad
public class Dad extends GrandDad {String car = "瑪莎拉蒂";private String house = "小洋樓";public void swim() {System.out.println("游泳");}
}Son son = new Son();
System.out.println(son.car);
son.swim();
son.drawing();
System.out.println("----------------------");

3.子類可以直接或間接繼承父類的成員(直接或間接的使用父類的成員變量、成員方法),父類的私有成員,子類不能直接繼承,但是可以間接繼承(使用super關鍵字)

//System.out.println(son.house);
//'house' has private access in 'i_extends.d3.Dad'

4.Java中任何一個類都直接或間接的繼承Object類
,Object類提供了一個hashCode方法,可以返回對象在堆內存的十進制地址值

//需求:創建GrandDad類對象,嘗試調用hashCode方法GrandDad grandDad = new GrandDad();int hashCode = grandDad.hashCode();System.out.println(hashCode);
瑪莎拉蒂
游泳
繪畫
----------------------
356573597

三.繼承關系下,成員的訪問特點

目標:了解繼承關系中,子類訪問成員的特點
就近原則
1.成員(變量、方法)訪問的特點:

  • 子類有,就訪問子類自己的
  • 子類沒有,就訪問父類的
  • 子、父類都沒有,代碼報錯!
    2.指定訪問父類的成員:
  • 使用 super 訪問
public class Fu {String str = "我是父類變量";public void show() {System.out.println("我是父類的show方法");}
}public class Zi extends Fu {String str = "我是子類變量";public void show() {System.out.println("我是子類的show方法");}public void test() {//1.訪問變量strSystem.out.println(str);//2.訪問show方法show();**//3.指定訪問父類的str屬性和show方法**System.out.println(super.str);super.show();}
public class Demo {public static void main(String[] args) {//1.需求:按要求完成Zi類中的test方法//創建Zi類對象,調用test()方法Zi zi = new Zi();zi.test();}
}
//父類
public class Father {String field = "父類的和子類同名屬性";public void method() {System.out.println("父類的和子類同名方法");}
}//子類
public class Son extends Father {String field = "子類的和父類同名屬性";String ziField = "子類特有屬性";public void method() {System.out.println("子類的和父類同名方法...");}public void use() {String ziField = "子類局部變量";//練習:按要求完成以下需求//1.訪問子類的field屬性System.out.println(field);//2.訪問父類的field屬性System.out.println(super.field);//3.訪問ziField屬性,此時發現方法中有一個成員變量和一個成員方法同名,此時需要用 this 來表明訪問的是成員變量System.out.println(this.ziField);//4.訪問ziField局部變量System.out.println(ziField);//5.訪問method方法method();//6.訪問父類的method方法super.method();}
}

小結

  1. 在子類方法中訪問父類成員變量、成員方法遵循什么原則?
    就近原則:子類有就用子類的,子類沒有就用父類的,父類沒有就報錯
  2. 如果子、父類中出現了重名的成員變量、成員方法,如何區分?
    super.父類成員 … this.本類成員

四.方法重寫

  • 子類和父類有一模一樣方法聲明,但方法體可能不一樣,此時子類方法會覆蓋父類的方法(這種格式稱為方法重寫)

目標:掌握方法重寫的特點和使用場景

### 實例
需求:在不影響B類繼承使用Fu類show功能的前提下,讓A類執行自己特有的show功能:"A類特有的show方法"
1.在子類A中,寫一個和父類Fu一模一樣的show方法(子類A重寫了父類Fu的show方法)```java
public class Fu {public void show() {System.out.println("fu...show...");}
}
public class B extends Fu {}
public class A extends Fu {public void show() {System.out.println("A類特有的show方法");}
}
public class Demo01 {public static void main(String[] args) {A a = new A();//方法重寫后,遵循就近原則a.show();B b = new B();b.show();}
}//執行結果:
//A類特有的show方法
//fu...show...

``

方法重寫的注意事項

目標:了解方法重寫的注意事項

  1. 重寫方法的名稱、形參列表必須和父類相同
  2. 子類重寫的方法返回值類型,要小于等于父類方法的返回值類型(約定:父類大于子類)
  3. 子類重寫父類方法時,訪問權限必須大于或者等于父類 (private < 缺省 < protected < public)
  4. 父類私有方法,子類不能重寫

方法重寫的校驗

@Override注解,標記一個方法是重寫父類方法(語法檢查)
需求:讓SubClass類重寫SuperClass類的各個方法

public class SuperClass {public void method1() {System.out.println("super...public...");}public A method2() {return new A();}protected void method3() {System.out.println("super...protected...");}void method4() {System.out.println("super...default...");}private void method5() {System.out.println("super...private...");}
}
public class SubClass extends SuperClass {//1.重寫method1方法:保持方法名稱、形參列表相同@Overridepublic void method1() {//public void method1(int age) {System.out.println("子類重寫的method1");}//2.重寫method2方法@Override//public Fu method2() {//注意:子類重寫父類方法,返回值類型需要小于等于父類的public A method2() {return new A();}//3.重寫method3、method4、method5方法@Overrideprotected void method3() {//注意:子類重寫父類方法,訪問權限要大于等于父類的//public void method3() {//void method3() {//private void method3() {System.out.println("子類重寫的method3");}@Overridevoid method4() {//protected void method4() {//public void method4() {//private void method4() {System.out.println("子類重寫的method4");}//@Override//注意:父類私有方法,子類不能重寫private void method5() {System.out.println("子類自己的method5方法");}

繼承關系下,構造器的訪問特點

目標:了解繼承關系中,構造器的訪問特點
特點:訪問構造器時,會先默認訪問父類的空參構造器
原因:在子類的構造器第一行有一句隱藏的super();
在這里插入圖片描述

  • super訪問父類構造器
    super(); 用來訪問父類空參數構造器
    super(參數); 訪問父類有參數構造器
    在這里插入圖片描述
    子類繼承父類后構造器的訪問特點是什么樣的?
    子類中所有的構造方法默認都會先訪問父類中__空參數構造方法

子類構方法第一行默認有一句__super()________
如果不想訪問父類空參數構造器,可以使用___super(參數)_________ 訪問父類有參數構造器
訪問本類的構造器格式是:this()、this(參數)_____________
補充: this(),super() 都只能寫在構造器的第 條語句

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

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

相關文章

防抖和字節流

防抖&#xff08;Debouncing&#xff09;和字節流&#xff08;Byte Stream&#xff09;是兩個不同的概念&#xff0c;分別在編程和數據傳輸領域中使用。 防抖&#xff08;Debouncing&#xff09; 防抖是一種在前端開發中常用的技術&#xff0c;用于控制事件處理函數的執行頻率…

Android多開應用軟件系統設計

設計一個支持Android多開應用的軟件系統&#xff0c;主要涉及到以下幾個關鍵技術點和設計考慮&#xff1a; 1. 虛擬化技術 容器技術&#xff1a;與傳統的虛擬機不同&#xff0c;可以采用更輕量級的容器技術&#xff0c;為每個應用實例創建獨立的運行環境。這包括分配獨立的用…

Ubuntu配置sendmail client,用sendmail命令來發送郵件

參考文檔 https://mailoutgoing.com/support/mailrelay/sendmail.html https://www.sendmail.org/~ca/email/auth.html https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/configure-sendmail.html 總結 1、ubuntu環境下&#xff0c;sendmail服務位于/etc/i…

HTTP 請求走私漏洞詳解

超詳細的HTTP請求走私漏洞教程&#xff0c;看完還不會你來找我。 1. 簡介 HTTP請求走私漏洞&#xff08;HTTP Request Smuggling&#xff09;發生在前端服務器&#xff08;也稱代理服務器&#xff0c;一般會進行身份驗證或訪問控制&#xff09;和后端服務器在解析HTTP請求時&…

上位機圖像處理和嵌入式模塊部署(mcu項目2:串口日志記錄器)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 淘寶上面有一個商品蠻好玩的&#xff0c;那就是日志記錄器。說是記錄器&#xff0c;其實就是一個模塊&#xff0c;這個模塊的輸入是一個ttl串口&am…

利用Python進行數據分析PDF下載經典數據分享推薦

本書由Python pandas項目創始人Wes McKinney親筆撰寫&#xff0c;詳細介紹利用Python進行操作、處理、清洗和規整數據等方面的具體細節和基本要點。第2版針對Python 3.6進行全面修訂和更新&#xff0c;涵蓋新版的pandas、NumPy、IPython和Jupyter&#xff0c;并增加大量實際案例…

Docker Desktop如何換鏡像源?

docker現在很多鏡像源都出現了問題,導致無法拉取鏡像,所以找到一個好的鏡像源,尤為重要。 一、阿里鏡像源 經過測試,目前,阿里云鏡像加速地址還可以使用。如果沒有阿里云賬號,需要先注冊一個賬號。 地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 二…

基于Java技術的B/S模式書籍學習平臺

你好&#xff0c;我是專注于計算機科學領域的學姐碼農小野。如果你對書籍學習平臺開發感興趣或有相關需求&#xff0c;歡迎私信聯系我。 開發語言&#xff1a; Java 數據庫&#xff1a; MySQL 技術&#xff1a; B/S模式、Java技術 工具&#xff1a; Eclipse、Navicat、Mave…

【Go】函數的使用

目錄 函數返回多個值 init函數和import init函數 main函數 函數的參數 值傳遞 引用傳遞&#xff08;指針&#xff09; 函數返回多個值 用法如下&#xff1a; package mainimport ("fmt""strconv" )// 返回多個返回值&#xff0c;無參數名 func Mu…

相鄰不同數字的標記

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 來源&#xff1a;牛客網 時間限制&#xff1a;C/C 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C 262144K&#xff0c;其他語言524288K 64bit IO Format: %lld 題目描述 小紅拿到了一個數組&#xff0c;每個數…

ctfshow web入門 nodejs web334--web337

web334 有個文件下載之后改后綴為zip加壓就可以得到兩個文件 一個文件類似于index.php 還有一個就是登錄密碼登錄成功就有flag username:ctfshow password:123456因為 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

SpringBoot的熱部署和日志體系

SpringBoot的熱部署 每次修改完代碼&#xff0c;想看效果的話&#xff0c;不用每次都重新啟動代碼&#xff0c;等待項目重啟 這樣就可以了 JDK官方提出的日志框架&#xff1a;Jul log4j的使用方式&#xff1a; &#xff08;1&#xff09;引入maven依賴 &#xff08;2&#x…

軟件開發語言都有哪些?

構建高效、穩定且安全的服務器應用&#xff0c;開發者們需要選擇合適的編程語言。以下是幾種流行的網絡服務器開發語言&#xff0c;每種語言都有其獨特的特性和適用場景。 Java Java是一種廣泛使用的高級編程語言&#xff0c;以其“一次編寫&#xff0c;到處運行”的理念而著稱…

光譜優化算法(Lightning Search Optimization, LSO)及其Python和MATLAB實現

光譜優化算法&#xff08;Lightning Search Optimization, LSO&#xff09;是一種基于自然界雷暴現象啟發的新型優化算法&#xff0c;旨在尋找最優解或近似最優解的問題。LSO算法不僅可以用于連續優化問題&#xff0c;還能用于離散優化問題。接下來將詳細介紹LSO算法的背景、原…

內鏡像源-大全

1、pip安裝鏡像 阿里鏡像 https://developer.aliyun.com/mirror/ 清華大學開源軟件鏡像 https://mirrors.tuna.tsinghua.edu.cn/ 浙大鏡像源 http://mirrors.zju.edu.cn/ 網易鏡像源 https://mirrors.163.com/ sohu鏡像源 https://mirrors.sohu.com/ 中科大鏡像 https://mirr…

OS Copilot測評-CSDN

登錄控制臺 安裝插件 sudo yum install -y os-copilot效果如下 配置 AccessKey ID 與 AccessKey Secret 注意安全&#xff0c;使用完成后&#xff0c;別忘了去控制臺刪除&#xff0c;一般情況使用子Key就可以 檢測是否可用 co hi實際操作(當前為官方案例請求) 實操1&…

RoPE 旋轉位置編碼,詳細解釋(下)NLP 面試的女生徹底說明白了

RoPE 旋轉位置編碼&#xff0c;詳細解釋&#xff08;下&#xff09;NLP 面試的女生徹底說明白了 原創 看圖學 看圖學 2024年07月01日 07:55 北京 書接上文&#xff0c;上文見&#xff1a;這么解釋 RoPE 旋轉位置編碼&#xff0c;女朋友睜大了雙眼&#xff08;上&#xff09; …

C++ explicit 用法

一、概述 explicit關鍵字用于防止構造函數或轉換操作符在不明確的情況下被隱式調用&#xff0c;從而避免意外的類型轉換。這在類的設計中非常有用&#xff0c;可以增強代碼的可讀性和安全性。 二、用法示例 1. 用于構造函數 假設有一個簡單的類 A&#xff1a; class A { p…

metersphere鏈接騰訊郵箱步驟

1、打開騰訊郵箱生成授權碼 路徑&#xff1a;設置-賬戶-賬戶安全 生成的授權碼只會展示1次&#xff0c;注意保存 2、在系統設置-系統參數設置-郵件設置填寫授權碼和SMTP信息 SMTP信息在郵箱的客戶端設置中可以獲取到對應的信息 3、信息填寫完后&#xff0c;可以測試連接&…

python中TensorFlow框架的簡單深度學習項目圖像分類示例

??引言 &#x1f44d;&#x1f44d;點關注編程夢想家&#xff08;大學生版&#xff09;-CSDN博客不迷路?? 這個示例項目使用了CIFAR-10數據集&#xff0c;這是一個包含10個類別的60,000張32x32彩色圖像的數據集&#xff0c;類別包括飛機、汽車、鳥類等。模型是一個簡單的…