Java基礎十二--多態是成員的特點

来源:http://www.cnblogs.com/Renyi-Fan/archive/2017/06/03/6936090.html
-Advertisement-
Play Games

Java基礎十二--多態是成員的特點 一、特點 1,成員變數。 編譯和運行都參考等號的左邊。 覆蓋只發生在函數上,和變數沒關係。 Fu f = new Zi();System.out.println(f.num);//是父類,答案是3 2,成員函數(非靜態)。 編譯看左邊,運行看右邊。 因為成員函數 ...


Java基礎十二--多態是成員的特點

一、特點

1,成員變數。

編譯和運行都參考等號的左邊。

覆蓋只發生在函數上,和變數沒關係。

Fu f = new Zi();
System.out.println(f.num);//是父類,答案是3

2,成員函數(非靜態)。

編譯看左邊,運行看右邊。

因為成員函數存在覆蓋特性。

Fu f = new Zi();//
f.show();
輸出的是子類裡面的show方法

3,靜態函數。

編譯和運行都看左邊。

靜態函數不具備多態性,多態性是對象的多態性,然後靜態函數不涉及對象。

Fu f = new Zi();//
f.show();
這裡最後輸出的是父類的show裡面的內容。

Zi z = new Zi();//
z.show();

輸出的是子類裡面的show

 

二、實例

  1 /*
  2 多態時,
  3 成員的特點:
  4 1,成員變數。
  5     編譯時:參考引用型變數所屬的類中的是否有調用的成員變數,有,編譯通過,沒有,編譯失敗。
  6     運行時:參考引用型變數所屬的類中的是否有調用的成員變數,並運行該所屬類中的成員變數。
  7     簡單說:編譯和運行都參考等號的左邊。哦了。
  8     作為瞭解。
  9 覆蓋只發生在函數上,和變數沒關係。
 10 Fu f = new Zi();
 11 System.out.println(f.num);//是父類,答案是3
 12 沒根據f的值(子類對象的地址)去找,而是根據f的類型去找。
 13 開發時不可能出現這樣的情況,我父類有了,我子類就直接拿來用了,而且用的時候一般都已經向下轉型了。
 14 
 15 
 16 
 17 
 18 2,成員函數(非靜態)。
 19     編譯時:參考引用型變數所屬的類中的是否有調用的函數。有,編譯通過,沒有,編譯失敗。
 20     運行時:參考的是對象所屬的類中是否有調用的函數。
 21     簡單說:編譯看左邊,運行看右邊。
 22 
 23     因為成員函數存在覆蓋特性。
 24 Fu f = new Zi();//
 25 f.show();
 26 輸出的是子類裡面的show方法
 27 依賴的是對象,有對象才有成員函數,必須動態的綁定到指定的對象上,所以運行的時候是看子類,而編譯的時候檢查語
 28 
 29 法錯誤,所以編譯的時候檢查父類,所以看父類。
 30 編譯檢查語法錯誤,運行時根據引用指向的地址運行。
 31 
 32 
 33 
 34 
 35 3,靜態函數。
 36         編譯時:參考引用型變數所屬的類中的是否有調用的靜態方法。
 37         運行時:參考引用型變數所屬的類中的是否有調用的靜態方法。
 38         簡單說,編譯和運行都看左邊。
 39 
 40         其實對於靜態方法,是不需要對象的。直接用類名調用即可。
 41 Fu f = new Zi();//
 42 f.show();
 43 這裡最後輸出的是父類的show裡面的內容,因為靜態成員不需要對象,直接是被類名指向,都指向存靜態方法的方法區,
 44 
 45 而那個裡面存的就是父類的show。
 46 Zi z = new Zi();//
 47 z.show();
 48 這裡的zi是繼承fu的,show方法是靜態的
 49 輸出的是子類裡面的show
 50 其實可以理解為靜態函數不具備多態性,多態性是對象的多態性,然後靜態函數不涉及對象
 51 父類對象引用,就是指向父類的靜態函數
 52 子類對象引用,就是指向子類的對象函數
 53 
 54 
 55         
 56 
 57 */
 58 
 59 class Fu
 60 {
 61 //    int num = 3;
 62     void show()
 63     {
 64         System.out.println("fu show");
 65     }
 66 
 67     static void method()
 68     {
 69         System.out.println("fu static method");
 70     }
 71 }
 72 
 73 class Zi extends Fu
 74 {
 75 //    int num = 4;
 76     void show()
 77     {
 78         System.out.println("zi show");
 79     }
 80 
 81     static void method()
 82     {
 83         System.out.println("zi static method");
 84     }
 85 }
 86 
 87 
 88 
 89 class  DuoTaiDemo3
 90 {
 91     public static void main(String[] args) 
 92     {
 93         Fu.method();
 94         Zi.method();
 95 //這個的實質是父類對象指向子類引用,就是有點像指針,f的值是子類對象的地址。
 96         Fu f = new Zi();//
 97 //        f.method();//輸出是父類的靜態
 98 //        f.show();//編譯的時候檢查的是父類,運行的時候以子類為主,show被覆蓋,運行的子類的show
 99         //輸出是子類的show,
100 //        System.out.println(f.num);//是父類,答案是3
101 
102 
103 //        Zi z = new Zi();
104 //        System.out.println(z.num);//是子類,答案是4
105     }
106 }

 

三、記憶體儲存分析

Fu f = new Zi();

Fu f 在棧中定義了一個引用,也就是指針。

new Zi() 在堆中定義了一個對象,只不過這個對象有父類的那一部分成員。

1、如果用子類引用指向這個對象,全部訪問的是子類的。

2、如果用父類引用指向這個對象,全部訪問的是這個對象裡面父類的,只不過父類函數被覆蓋,所以導致成員是父類,函數時子類的。

肯定是根據指針類型去訪問要訪問的東西。貓肯定要去吃貓糧,狗才去吃狗糧。

 


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

-Advertisement-
Play Games
更多相關文章
  • 視頻教程地址:http://www.imooc.com/learn/102 一、什麼是Less css的Less好比是js的Jquery,可以讓人們更方遍快捷的使用css,使css代碼更簡潔,可以減少重覆的代碼,減少開發人員的工作量。 Less CSS是一種動態樣式語言,屬於CSS預處理語言的一種, ...
  • 1. 業務場景 IdentityServer4 授權配置 中的 ,設置的是具體的 API 站點名字,也就是使用方設置的 ,示例代碼: 上面兩個 配置要一致,問題來了,因為授權中心的 配置是整個 API 服務,如果我們存在多個 配置,比如一個前臺和後臺,然後都需要訪問 ,就會出現一些問題。 比如, 服 ...
  • 完成效果: 解釋: 主視窗是MDI視窗,視窗中有子視窗,子視窗中控制項有 樹形圖treeview、panel控制項、listview控制項(這是一個視窗中的listview)、butten控制項。 功能: 單擊樹形圖中的”員工管理“ panel中會顯示listview數據 其他功能暫時沒寫。。。。。。 主窗 ...
  • ASP.NET Core 應用程式發佈命令: 發佈示例命令(生成在 目錄下): 上面命令並沒有指定 發佈,什麼意思呢?比如 ASP.NET Core 應用程式中的 配置,測試環境和生產環境配置並不相同(比如資料庫連接字元串),如果用上面的發佈命令,我們還需要手動拷貝下不同環境的 文件,以後要更改了, ...
  • 源碼支持QQ 1039318332 源碼地址:http://git.oschina.net/sunzewei/EIP 一、更新記錄1、更新日期:2017-02-24 00:00:002、更新內容: 版本升級:V2.0 1、支持多資料庫,可在實體類指定具體操作資料庫,可實現系統分庫操作 2、重新整理架 ...
  • 本章和大家分享的內容是使用Signal R框架創建個簡易的群聊功能,主要講解如何在.Net的MVC中使用這個框架,由於這個項目有官方文檔(當然全英文),後面也不打算寫分享篇了,主要目的是讓朋友們在需要使用Web實時通信的時候有更多一種解決方案,畢竟這是微軟主推的一種解決方案之一。 SignalR網上 ...
  • NuGet包地址: https://www.nuget.org/packages/OYMLCN.WeChat.Core 由於來的OYMLCN.WeChat存在深度封裝,並沒有做完整的測試,對於使用不友好,現已重新構建SDK的接收消息被動回覆模塊。 現已做到最大程度的簡易化及模塊化,每個模塊都已完成單 ...
  • 回到目錄 在MVC,EF,LINQ環境里,我們經常會用到DataModel(DO)和ViewModel(VO),可能對於它們的屬性校驗我們會採用特性的方式,當然這很直觀,就連微軟的DEMO也是如些,一般是這樣的代碼 而這種設計方式給我們以後的維護帶來很多問題,具體大叔總結一下: 綜上所述,Fluen ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...