Java:繼承和多態(必會知識點整理)

主要內容

  1. 繼承
  2. 多態
  3. 向上轉型
  4. 向下轉型
  5. 方法重寫
  6. 方法重載
  7. super關鍵字
  8. 動態綁定
  9. 封裝訪問控制
  10. 構造方法規則

一、繼承

1. 概念:

一句話說就是:“共性抽取,代碼復用”

    1. 子類會將父類中的成員變量或者成員方法繼承到子類中
    1. 子類繼承父類之后,必須要新添加自己特有的成員,體現出與基類的不同,否則就沒有必要繼承了

2. 語法:

(1) extends

修飾符 class 子類 extends 父類{//...
}

(2) 父類成員訪問:

訪問1:子類中訪問父類的成員變量
    1. 子類和父類不存在同名成員變量
    • 正常訪問
    1. 子類和父類成員變量同名

    循就近原則,自己有優先自己的,如果沒有則向父類中找。

    • 如果訪問的同名成員變量子類中有,優先訪問子類自己的成員變量

    • 如果訪問的成員變量子類中無,則訪問父類繼承下來的,如果父類也沒有定義,則編譯報錯

    • 如果訪問的成員變量與父類中成員變量同名,則優先訪問自己的

訪問2:子類中訪問父類的成員方法
  • 成員方法名字不同

    • 成員方法沒有同名時,在子類方法中或者通過子類對象訪問方法時,則優先訪問自己的,自己沒有時再到父類中找,如果父類中也沒有則報錯。
  • 成員方法名字相同

    class Parent {void show(int x) { System.out.println("Parent:int"); }
    }class Child extends Parent {void show(String s) { System.out.println("Child:String"); } // 重載void demo() {show(10);    // 調用父類方法show("hello"); // 調用子類重載方法}
    }
    
    • 通過子類對象訪問父類與子類中不同名方法時,優先在子類中找,找到則訪問,否則在父類中找,找到則訪問,否則編譯報錯。
    • 通過子類對象訪問父類與子類同名方法時,如果父類和子類同名方法的參數列表不同(重載)根據調用方法適傳遞的參數選擇合適的方法訪問,如果沒有則報錯
class Base {int a = 10;String b = "父類";void methodA() { System.out.println("父類方法A"); }
}class Derived extends Base {int a = 20; // 同名成員變量void methodA() { System.out.println("子類重寫方法A"); } // 方法重寫void methodB() { System.out.println("子類特有方法B"); }void test() {System.out.println(a);        // 輸出20(就近原則)System.out.println(super.a); // 輸出10(顯式訪問父類)methodA();                   // 調用子類重寫方法super.methodA();              // 調用父類被覆蓋方法}
}

3. super

  • 在子類方法中訪問父類的成員。

    • 只能在==非靜態方法==中使用

    • 在子類方法中,訪問父類的成員變量和方法。

    • superthis:

      class Animal {String type = "Animal";
      }class Cat extends Animal {String type = "Cat";void print() {System.out.println(this.type);   // Cat(當前對象成員)System.out.println(super.type);  // Animal(父類成員)}
      }
      
        1. this是當前對象的引用,當前對象即調用實例方法的對象,super相當于是子類對象中從父類繼承下來部分成員的引用
        1. 在非靜態成員方法中,this用來訪問本類的方法和屬性,super用來訪問父類繼承下來的方法和屬性
        1. 在構造方法中:this(...)用于調用本類構造方法,super(...)用于調用父類構造方法,兩種調用不能同時在構造方法中出現
        1. 子類構造方法中一定會存在super(...)的調用,用戶沒有寫編譯器也會增加,但是this(...)用戶不寫則沒有

4. 子類構造方法:

子類對象構造時,需要先調用基類構造方法,然后執行子類的構造方法。

  • 在構造子類對象時候 ,先要調用基類的構造方法,將從基類繼承下來的成員構造完整,然后再調用子類自己的構造方法,將子類自己新增加的成員初始化完整
class Person {String name;Person(String name) { this.name = name; System.out.println("Person構造");}
}class Student extends Person {int id;Student(String name, int id) {super(name); // 必須第一行!this.id = id;System.out.println("Student構造");}
}public class Main {public static void main(String[] args) {Student s = new Student("張三", 1001);}
}

輸出:

Person構造
Student構造
  • 注意:

      1. 若父類顯式定義無參或者默認的構造方法,在子類構造方法第一行默認有隱含的super()調用,即調用基類構造方法
      1. 如果父類構造方法是帶有參數的,此時需要用戶為子類顯式定義構造方法,并在子類構造方法中選擇合適的父類構造方法調用,否則編譯失敗。
      1. 在子類構造方法中,super(...)調用父類構造時,必須是子類構造函數中第一條語句。并且只能出現一次。
      1. super(...)只能在子類構造方法中出現一次,并且不能和this同時出現

二、封裝

(只針對Java,不同語言有些許差異)

No范圍privatedefaultprotectedpublic
1同一包中的同一類????
2同一包中的不同類???
3不同包中的子類??
4不同包中的非子類?

三、多態

一句話說就是:完成某個行為,當不同的對象去完成時會產生出不同 的狀態。

(1) 重寫(override):

  • 也稱為覆蓋。重寫是子類對父類非靜態、非private修飾,非final修飾,非構造方法等的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!

  • 注意:

    • 子類在重寫父類的方法時,一般必須與父類方法原型一致: 返回值類型 方法名 (參數列表) 要完全一致

    • 被重寫的方法返回值類型可以不同,但是必須是具有父子關系的

    • 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類方法被public修飾,則子類中重寫該方法就不能聲明為 protected

    • 父類被staticprivate修飾的方法、構造方法都不能被重寫。

    • 重寫的方法, 可以使用 @Override 注解來顯式指定. 有了這個注解能幫我們進行一些合法性校驗. 例如不小心將方法名字拼寫錯了 (比如寫成 aet), 那么此時編譯器就會發現父類中沒有 aet 方法, 就會編譯報錯, 提示無法構成重寫.

(2) 重寫和重載:

區別點重寫(override)重載(overload)
參數列表一定不能修改必須修改
返回類型不能修改(除非是父子類兼容的返回類型)可以修改
訪問限定符不能做更嚴格的限制(可以相同或更寬松)可以修改

(3) 靜態綁定和動態綁定:

  • 靜態綁定:也稱為前期綁定(早綁定),即在編譯時,根據用戶所傳遞實參類型就確定了具體調用那個方法。典型代表函數重載。

  • 動態綁定:也稱為后期綁定(晚綁定),即在編譯時,不能確定方法的行為,需要等到程序運行時,才能夠確定具體調用那個類的方法。

(4) 多態實現條件:

    1. 必須在繼承體系下
    1. 子類必須要對父類中方法進行重寫
    1. 通過父類的引用調用重寫的方法
    父類類型 變量名 = new 子類對象();  
    變量名.方法(); // 實際調用的是子類重寫的方法  
    
    class Animal {  void sound() { System.out.println("動物叫"); }  
    }  class Cat extends Animal {  @Override  void sound() { System.out.println("喵喵喵"); } // 重寫  
    }  public class Main {  public static void main(String[] args) {  Animal a = new Cat(); // 向上轉型  a.sound(); // 輸出"喵喵喵"(動態綁定,執行子類方法)  }  
    }  
    

四、向上轉移和向下轉型:

1. 向上轉型:

從小范圍向大范圍的轉換

  • 實際就是創建一個子類對象,將其當成父類對象來使用。

  • 父類類型 對象名 = new 子類類型()

    Animal animal = new Cat("kitty",2)
    
  • 使用:

      1. 直接賦值

        Animal cat = new Cat("kitty",2); //子類對象直接賦值給父類對象
        
      1. 方法傳參
      public static void eatFood(Animal a){a.eat();
      }
      
      1. 方法返回

         public static Animal getAnimal(String type) {if ("dog".equals(type)) {return new Dog();  // 向上轉型:Dog→Animal} else if ("bird".equals(type)) {return new Bird(); // 向上轉型:Bird→Animal}return new Animal();}
        

2. 向下轉型(有風險):

將父類引用再還原為子類對象,即向下轉換

public class Main {public static void main(String[] args) {Animal animal = new Cat();  // 向上轉型// 向下轉型(必須先向上轉!)if (animal instanceof Cat) {  // 安全檢查Cat cat = (Cat) animal;   // 強制轉換cat.catchMouse();        // 輸出"貓抓老鼠"}// 錯誤示例:直接轉型非子類對象(運行時拋出ClassCastException)// Animal dog = new Animal();// Cat wrongCat = (Cat) dog;  // 報錯!}
}

注意:

  • 必須通過 instanceof 檢查安全性,避免 ClassCastException
  • 只有原本是子類對象的父類引用才能成功向下轉型。

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

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

相關文章

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹🔖有關esp32/8266相關項目:需要自己搭建編譯環境: https://github.com/windowsair/wireless-esp8266-dap/tree/master🌿支持esp32/c3/s3,支持在線固件燒錄,支持AP配網&…

深入了解linux系統—— 進程信號的產生

前言 進程在收到信號之后,可以立即處理,也可以在合適的時間再處理(1-31號普通信號可以不被立即處理) 信號不是被立即處理,信號就要被保存下來,讓進程在合適的時間再去處理。 相關概念 在了解進程是如何保存…

【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程,從enable()函數觸發開始,深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節,揭示…

各種開發語言主要語法對比

各類主流編程語言的語法有著顯著差異,這些差異源于語言設計哲學(簡潔性 vs 顯式性)、應用領域(系統級、Web、數據科學)、運行方式(編譯 vs 解釋)以及支持的范式(面向對象、函數式、過…

小鵬汽車6月交付車輛34,611輛,同比增長224%

小鵬汽車-W(09868)發布公告,2025年6月,小鵬汽車共交付智能電動汽車34,611輛,同比增長224%,這標志著小鵬汽車已連續第八個月交付量超過了30,000輛。2025年第二季度,小鵬汽車共交付103,181 輛智能電動車,創下…

深入理解觀察者模式:構建松耦合的交互系統

在軟件開發中,我們經常遇到這樣的場景:一個對象的狀態變化需要通知其他多個對象,并且這些對象需要根據變化做出相應的反應。比如,用戶界面中的數據變化需要實時反映到多個圖表上,或者電商系統中的庫存變化需要通知訂單…

React強大且靈活hooks庫——ahooks入門實踐之常用場景hook

什么是 ahooks? ahooks 是一個 React Hooks 庫,提供了大量實用的自定義 hooks,幫助開發者更高效地構建 React 應用。其中場景類 hooks 是 ahooks 的一個重要分類,專門針對特定業務場景提供解決方案。 安裝 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget(一)1.QWidget2.enabled屬性2.geometry🌟🌟hello,各位讀者大大們你們好呀🌟🌟 🚀🚀系列專欄:【Qt的學習】 📝📝本…

AIOT開發選型:行空板 K10 與 M10 適用場景與選型深度解析

前言 隨著人工智能和物聯網技術的飛速發展,越來越多的開發者、學生和愛好者投身于創意項目的構建。 在眾多的開發板中,行空板 K10 和 M10 以其獨特的優勢脫穎而出。 本文旨在為讀者提供一份詳盡的行空板 K10 和 M10 對比分析,從適用場景、…

redis匯總筆記

語雀完整版: https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis筆記》 Redis 一般問題 Redis內存模型(I/O多路模型)多路復用IO如何解釋 為什么Redis要使用單線…

STM32用PWM驅動步進電機

硬件介紹:連線:注意這里stp連的是pwm脈沖,dir連的是方向到時候代碼pwm波形就是從這里來的,具體接線根據你的代碼來注意要點:步進電機和舵機驅動是不一樣的,它是根據步長來移動的,所以要開一個中…

力扣25.7.10每日一題——重新安排會議得到最多空余時間 II

Description 今天這道題和昨天類似,只是允許順序變化。 Solution 把會議區間視作桌子,空余時間視作空位,我們要把一個桌子移到別的空位中。 初步想法是枚舉桌子,找一個長度大于等于桌子長度的空位移過去。看上去,找…

IP報文分片與重組原理及實現分析

IP報文分片與重組原理及實現分析 引用: ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 當IP數據包大小超過MTU(最大傳輸單元)時,路由器/主機將其分割為多個片段傳輸,每個片段包含&…

[python]在drf中使用drf_spectacular

安裝drf_spectacular 文檔 pypi鏈接:https://pypi.org/project/drf-spectacular/ 文檔鏈接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安裝步驟 在環境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令營】 用AI做帶貨視頻評論分析(二)

5.預訓練模型跑分 回顧賽題 回顧賽題任務 挑戰與難點: 標注數據少 ——> 半監督學習 or 數據增強 聚類分析噪點影響嚴重 回顧Baseline 問題: TF-IDF無法捕捉以下語義。聚類分析粗糙,未評估聚類質量。 提升方案: 分類任務…

SPSSPRO:數據分析市場SaaS挑戰者的戰略分析

目錄 第一部分:執行摘要 第二部分:平臺解構:產品、架構與用戶體驗 2.1 SaaS范式轉移:架構與起源 2.2 功能能力:分析師的工具箱 2.3 “智能分析”的價值主張 第三部分:市場滲透與受眾細分 3.1 目標用戶…

低版本hive(1.2.1)UDF實現清除歷史分區數據

目標&#xff1a;通過UDF實現對表歷史數據清除 入參&#xff1a;表名、保留天數N 一、pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

C++中頂層const與底層const

在C中&#xff0c;const關鍵字用于定義常量&#xff0c;但它在指針和引用上下文中會產生兩種不同的常量性&#xff1a;頂層const&#xff08;top-level const&#xff09;和底層const&#xff08;low-level const&#xff09;。理解它們的區別是避免編譯錯誤和提高代碼質量的關…

“SRP模型+”多技術融合在生態環境脆弱性評價模型構建、時空格局演變分析與RSEI指數生態質量評價

集成云端、桌面端等環境&#xff0c;結合遙感云計算、GIS空間分析&#xff0c;R語言統計分析的優勢&#xff0c;以分析生態環境脆弱性的時空演變為主線。通過本課程的學習&#xff0c;您將掌握&#xff1a;第一&#xff0c;收集各類指標數據&#xff0c;構建的“生態壓力度-生態…

算法學習筆記:17.蒙特卡洛算法 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

在計算機科學和數學領域&#xff0c;蒙特卡洛算法&#xff08;Monte Carlo Algorithm&#xff09;以其獨特的隨機抽樣思想&#xff0c;成為解決復雜問題的有力工具。從圓周率的計算到金融風險評估&#xff0c;從物理模擬到人工智能&#xff0c;蒙特卡洛算法都發揮著不可替代的作…