Java 淺析三大特性之一多態

来源:http://www.cnblogs.com/qifengshi/archive/2016/07/13/5667316.html
-Advertisement-
Play Games

Java 淺析三大特性之一多態 之前我們的文章講了Java的封裝和繼承,封裝講的時候,並沒有體現出來封裝的強大之處,反而還要慎用封裝。因為這時的封裝還沒有和多態聯繫到一起,還無法看出向上轉型的厲害之處。 多態,是指同一個行為具有多種的表現形式。同一個方法根據調用對象的不同而產生多種結果。對於Java ...


Java 淺析三大特性之一多態

之前我們的文章講了Java的封裝和繼承,封裝講的時候,並沒有體現出來封裝的強大之處,反而還要慎用封裝。因為這時的封裝還沒有和多態聯繫到一起,還無法看出向上轉型的厲害之處。
多態,是指同一個行為具有多種的表現形式。同一個方法根據調用對象的不同而產生多種結果。對於Java而言,多態就是程式中定義的引用變數,和調用方法的代碼在編譯的時候就決定好了,但引用變數所指向的對象,卻是在運行時才確定的。舉一個很簡單的例子,人要工作。這裡工作是一個方法,但一個作家工作就是寫文章,一個程式員工作卻是寫代碼。工作的執行者不同,工作的內容也不同。這就是一種多態。

多態的實現

對於我們而言,實現多態要如下的準備。

  1. 繼承
  2. 方法覆寫
  3. 向上轉型

對於Java ,則是通過動態綁定來實現。我們先理解一下什麼是動態綁定,才方便後面去利用多態的特性。

動態綁定

綁定是指將一個方法調用同一個方法主體關聯起來。
動態綁定是值在運行時根據對象的類型進行綁定,而與之對應就是靜態綁定,在編譯期就進行綁定,在Java裡面只有final static private 和構造方法是靜態綁定的。
我們已經知道了一般方法的調用是在運行時根據對象的類型進行調用的,換句話說,不管你在代碼里是怎麼寫的,在運行時才會真正決定調用方法的對象是哪個。

實現形式

之前繼承的文章裡面,我們已經知道是可以通過向上轉型將一個子類轉型成父類,那麼我們就可以寫出下麵的代碼

Animal animal = new Dog();

如果Dog覆寫了Animal中的方法,那麼調用這個被覆寫的方法時根據上面的動態綁定的規則,我們就知道實際調用的對象是Dog,那麼執行的也會是Dog類的那個方法。具體的例子如下:

public class Animal {
    public void run() {
        System.out.println("動物在奔跑");
    }
}

public class Cat extends Animal {
    @Override
    public void run() {
        System.out.println("貓在奔跑");
    }
}

public class Dog extends Animal{
    @Override
    public void run() {
        System.out.println("狗在奔跑");
    }

    public static void main(String[] args) {
        Animal[] animal = {new Dog(),new Cat()};
        animal[0].run();
        animal[1].run();
    }
}
//運行的結果
狗在奔跑
貓在奔跑

在這個例子裡面,我們可以看到多態的應用,在父類中定義一個通用的run方法,在子類中去實現不同的run方法,然後將子類的對象賦給父類的引用,就可以根據子類的不同 去調用不同的run方法了。這裡面,多態的實現滿足了上面的三點,首先是繼承關係,其次,在子類中覆寫父類的方法,最後,對子類的對象進行向上轉型,產生多態。

多態的好處

我們在上個例子基礎上在添加一段代碼:

public class Log {
    public void print(Animal animal) {
        System.out.println(new Date().toString());
        animal.run();
    }

}
//我們將Dog類,修改成下麵這個樣子
public class Dog extends Animal{
    @Override
    public void run() {

        System.out.println("狗在奔跑");
    }

    public static void main(String[] args) {
        Animal[] animal = {new Dog(),new Cat()};
        for (Animal item : animal) {
            new Log().print(item);
        }
    }
}
運行的結果如下:
Wed Jul 13 17:07:40 CST 2016
狗在奔跑
Wed Jul 13 17:07:40 CST 2016
貓在奔跑

在上面的例子中,如果我們不採用多態,那麼我們在Log中就要根據不同的對象,生成不同print方法,這樣修改起來異常的麻煩。而採用多態的話,我們只需要在方法中編寫父類的對象調用方法的代碼,但在運行時傳入子類的對象,就會動態綁定到子類上,調用子類實現的方法。這樣做,在添加新的動物類的時候,我們也不用修改我們的print方法,不用改變已經編寫好的代碼,那麼也不會影響已經實現的方法。多態成功的區分開了"改變的事物和未改變的事物"。這給我們編程帶來極大的便利。


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

-Advertisement-
Play Games
更多相關文章
  • 代碼很簡單,不多做解釋,如果有疑問和建議請留言,回第一時間回覆 C#代碼first class Program { static void Main(string[] args) { MyCallback mc = new MyCallback(); mc.Callback(new Action(s ...
  • 重寫模板查找方式: Application_Start()註冊 _ViewStart.cshtml @{ Layout = "~/Views/Shared/_Layout.cshtml".Replace("~/Views/", MyRazorViewEngine.GetView(Request)); ...
  • 完美的.net真泛型真的完美嗎 碼C#多年,不求甚解覺得泛型就是傳說中那麼完美,性能也是超級好,不錯,在絕大部分場景下泛型表現簡直可以用完美來形容,不過隨著前一陣重做IOC時,才發現與自己預想中不一樣,覺得自己還是圖樣圖森破,太過拿衣服了 在前面一篇文章(一步一步造個IoC輪子(二),詳解泛型工廠) ...
  • cocos2dx版本為3.10 1.在使用spine的過程中,發現了一個比較嚴重的問題:每次創建SkeletonAnimation的時候都會很卡,即使是使用同一個骨骼數據skeletonData。 跟蹤代碼發現,在每次調用函數spine::SkeletonAnimation::createWithF ...
  • 在實戰中學習Spring,本系列的最終目的是完成一個實現用戶註冊登錄功能的項目。 預想的基本流程如下: 1、用戶網站註冊,填寫用戶名、密碼、email、手機號信息,後臺存入資料庫後返回ok。(學習IOC,mybatis,SpringMVC的基礎知識,表單數據驗證,文件上傳等) 2、伺服器非同步發送郵件 ...
  • 今天實現了一個登錄功能的Struts2小程式。 期間遇到了許多問題,記憶猶新的是 (1)新版本的tomcat9和eclipse Neon Release (4.6.0) 發生了衝突,啟動伺服器的時候老是有警告,但是又找不到問題,不得已回滾到了以前的tomcat8,沒想到竟然好了!好了?這時候心裡真特 ...
  • 想學習爬蟲,又想瞭解python語言,有個python高手推薦我看看scrapy。 scrapy是一個python爬蟲框架,據說很靈活,網上介紹該框架的信息很多,此處不再贅述。專心記錄我自己遇到的問題以及解決方案吧。 給幾個鏈接吧,我是根據這幾個東西來嘗試學習的: scrapy中文文檔(0.24版, ...
  • 轉自:http://www.cnblogs.com/colincode/archive/2011/03/30/1999604.html 1.FastReport中如果訪問報表中的對象?可以使用FindObject方法。TfrxMemoView(frxReport1.FindObject(’memo1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...