談談多態

来源:http://www.cnblogs.com/haitaofeiyang/archive/2017/10/17/7684542.html
-Advertisement-
Play Games

概述 我們都知道面向對象有四個基本特性:抽象、封裝、繼承、多態。這四個特性,概括起來可以這麼理解,抽象、封裝、繼承是多態的基礎,多態是抽象、封裝、繼承的表現。多態,是Java中非常重要的一個部分,所以今天來談一下多態(Polymorphism)。 什麼是多態 不同類的對象對同一消息作出不同的響應就叫 ...


 

概述

我們都知道面向對象有四個基本特性:抽象、封裝、繼承、多態。這四個特性,概括起來可以這麼理解,抽象、封裝、繼承是多態的基礎,多態是抽象、封裝、繼承的表現。多態,是Java中非常重要的一個部分,所以今天來談一下多態(Polymorphism)。

 

什麼是多態

不同類的對象對同一消息作出不同的響應就叫做多態。就像上課鈴響了,上體育課的學生跑到操場上站好,上語文課的學生在教室里坐好一樣。

 

多態的作用

簡單講就是解耦。再詳細點講就是,多態是設計模式的基礎,不能說所有的設計模式都使用到了多態,但是23種中的很大一部分,都是基於多態的。

 

多態存在的三個條件

1、繼承:有繼承關係  

2、重寫:子類重寫父類方法  

3、向上轉型:父類引用指向子類對象

補充一下第二點,既然多態存在必須要有“子類重寫父類方法”這一條件,那麼以下三種類型的方法是沒有辦法表現出多態特性的(因為不能被重寫):

1、static方法,因為被static修飾的方法是屬於類的,而不是屬於實例的

2、final方法,因為被final修飾的方法無法被子類重寫

3、private方法和protected方法,前者是因為被private修飾的方法對子類不可見,後者是因為儘管被protected修飾的方法可以被子類見到,也可以被子類重寫,但是它是無法被外部所引用的,一個不能被外部引用的方法,怎麼能談多態呢

 

對於多態,可以總結它為:   
    一、使用父類類型的引用指向子類的對象;  
    二、該引用只能調用父類中定義的方法和變數;  
    三、如果子類中重寫了父類中的一個方法,那麼在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用) 
 
    四、變數不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變數,那麼在編譯時會報錯。

 多態的實現形式:

在Java中有兩種形式可以實現多態。繼承和介面

 

多態的分類

1、編譯時多態,即方法的重載,從JVM的角度來講,這是一種靜態分派(static dispatch)

2、運行時多態,即方法的重寫,從JVM的角度來講,這是一種動態分派(dynamic dispatch)

關於這一點,在寫到JVM的時候會詳細講到。

 

分析多態問題的幾條原則

如果不去理解多態的原理,就從使用的角度來講,以個人的學習、工作這幾年的經驗,總結出了多態無非就是三句話:

比如我們有一個父類Father,有一個子類Children

1、向上轉型是自動的。即Father f = new Children()是自動的,不需要強轉

2、向下轉型要強轉。即Children c = new Father()是無法編譯通過的,必須要Children c = (Children)new Father(),讓父類知道它要轉成具體哪個子類

3、父類引用指向子類對象,子類重寫了父類的方法,調用父類的方法,實際調用的是子類重寫了的父類的該方法。即Father f = new Children(),f.toString()實際上調用的是Children中的toString()方法

 

後記

多態是Java語言體系中最基礎、最重要的概念,工作中哪裡都有用到,必須好好地將它理解透了。另外,本篇文章是本人博客園發的第一篇文章,希望以後寫出更多更好、更有質量的文章。

 

轉載地址:

http://www.cnblogs.com/xrq730/p/4820237.html

http://www.cnblogs.com/chenssy/p/3372798.html


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

-Advertisement-
Play Games
更多相關文章
  • 本節內容 - 使用nm查看符號 - 使用readelf -s輸出符號信息 - 刪除符號表對反彙編的影響 - 使用strip刪除符號和調試信息 - 使用UPX壓縮並保護可執行文件 ...
  • spring boot / cloud (十九) 併發消費消息,如何保證入庫的數據是最新的? 消息中間件在解決非同步處理,模塊間解耦和,和高流量場景的削峰,等情況下有著很廣泛的應用 . 本文將跟大家一起討論以下其中的異常場景,如題. 場景 在實際工作中,大家可能也都遇到過這樣的需求 : 如 : 系統A ...
  • /p 問題描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用電腦生成了N個1到1000之間的隨機整數(N≤100),對於其中重覆的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 ...
  • 一、CURL小結 個人將歸納curl請求總結成三步 1、創建curl 句柄(curl_init),並設置參數(curl_setopt)(打開冰箱) 2、執行請求(curl_exec),處理返回的數據 (把大象塞進去) 3、關閉curl(curl_close),釋放所有資源(關上冰箱) 其實如果代碼看 ...
  • JavaWeb筆記 一、servlet 真正helloServlet所在的位置 HelloServlet.java package net.zixue.servlet; import jdk.nashorn.internal.runtime.arrays.IteratorAction; import ...
  • 一、序 畢業已經兩年了,曾經在學校學習的知識早已還給老師了,已經很久沒有好好學習了。雖然曾經也是高收入群體,但是因為從此再也不寫代碼了,覺得人生都沒有樂趣了,所以果斷離職了.....但是看著身邊越來越多的技術大牛和高收入人群和之前對比落差太大,心中未免有些不甘,所以重新撿起被遺忘的知識。曾子曰:“吾 ...
  • 1 ''' 2 生成器都是迭代器,迭代器不一定是生成器 3 ''' 4 5 # list1 = [1,2,3,4,5] 6 # p1 = iter(list1) # 等價於__iter__() 7 # print(p1) 8 # print(next(p1)) 9 # print(next(p1))... ...
  • STL
    模板和標準模板庫(STL) 一、模板的起源 變數四要素:類型、名稱、值、地址 數據類型:存儲形式、編碼格式、運算規則、訪問方式 int a = 0; // 補碼 float b = 0; // 階碼 char c = 'A'; // ASCII char_t d = 'A'; // UCS 4 in ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...