構造方法的調用順序和成員變量的初始化時機以及動態綁定

? ? ?構造方法的調用順序:子類構造器中,JVM會自動的先調用父類的構造方法,然后再執行子類構造方法。在JVM自動調用父類構造方法的時候,會完成父類中擁有的成員變量的值的初始化操作,此時子類的成員變量并未初始化,java中基本類型都會使用JVM給定的默認值(如int為0),只有當父類構造方法調用結束,并到執行子類構造器時才會進行子類成員變量的初始化過程。

? ? ?動態綁定:對于非private、static、final修飾的方法,JVM是在運行期間,用函數指針指向實習對象類型的方法。比如,子類重寫了父類的A方法,使用父類Upper的引用upper指向了子類Sub對象,然后upper.A(),實際調用的類Sub中A方法。我是這樣理解的,子類和父類中都有方法A,并且子類是通過重寫的方式實現了A,所以子類對象原本Upper中指向方法A的指針和Sub類中指向A的指針是通過同一個函數指針,兩次賦值。就是指針point值被替換了,不是把父類的函數指針隱藏了,而是相當于兩次給指針賦值,第一次使用父類A方法的指針賦給point,第二次使用子類A方法的指針賦給point(以上純屬自己的理解,如果不真確歡迎給位老師指點,因為自己還是剛入行)。所以每一父類的方法的地址被子類方法的地址替換了。

demo:

Upper Code:

 1 package com.hq.dynamicBind;
 2 
 3 public class Upper {
 4 
 5     private int i = 1;
 6     
 7     public void print(){
 8         System.out.println("i="+i);
 9     }
10     
11     public Upper(){
12         System.out.println("父類構造函數開始");
13         System.out.println("i="+i);
14         print();
15         System.out.println("父類構造函數嗲用print()結束");
16         i = 30;
17     }
18 }

Sub Code:

 1 package com.hq.dynamicBind;
 2 
 3 public class Sub extends Upper {
 4 
 5     private int j = 20;
 6     
 7     public void print() {
 8         System.out.println("j="+j);
 9     }
10     
11     public Sub(){
12         System.out.println("成員變量j="+j);
13         print();
14         j = 40;
15     }
16 
17 }

Client Code:

1 package com.hq.dynamicBind;
2 
3 public class Client {
4 
5     public static void main(String[] args ){
6         new Sub().print();
7     }
8 }

執行結果:

父類構造函數開始
i=1
父類構造函數嗲用print()結束
成員變量j=20
j=20
j=40

?

轉載于:https://www.cnblogs.com/lingxiasandu/archive/2013/04/19/3029892.html

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

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

相關文章

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函數參數傳遞 strings, tuples, 和numbers是不可更改的對象,而list,dict等則是可以修改的對象 2 Python中的元類(metaclass) 3 staticmethod和classmethod python 三個方法,靜態方法&#xf…

突然不能 ip訪問服務器文件夾,用友U8 工作站連接不到服務器,ping IP及服務器名都正常,訪問服務器共享文件夾也正常...

用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符問題原因:錯誤原因見下面解決方案中的分析。解決方法:在查詢存貨明細帳和現存量09倉庫存貨510241數量為123,但在添采購入庫單紅字時卻…

rocketmq 消息 自定義_RocketMQ消息軌跡-設計篇

RocketMQ 消息軌跡主要包含兩篇文章:設計篇與源碼分析篇,本節將詳細介紹RocketMQ消息軌跡-設計相關。RocketMQ消息軌跡,主要跟蹤消息發送、消息消費的軌跡,即詳細記錄消息各個處理環節的日志,從設計上至少需要解決如下…

再次獻給那些心軟的人!!!

上次那篇日志朋友看了評論說:別太悲觀……為那些壞人成為壞人才是最不值得的!而且好人說要當壞人就只是說說而已,真碰到啥事,依舊會傻傻的幫……沒錯,我還是傻傻的幫了,最初會表現出一點不樂意,…

手機做服務器性能咋樣,服務器性能不足 怎樣才能逼出最強狀態

而且,服務器的節能不僅僅意味著節省了電費,其后續的散熱降溫等工作都可以得到更好的節約。同時,服務器的在長時間工作的情況下,保持較低溫度有利于降低其承載負荷,最大限度發揮其能力,保障服務器工作運行的…

ASP.NET跨頁面傳值技巧總結

1. 使用QueryString變量 QueryString是一種非常簡單的傳值方式,他可以將傳送的值顯示在瀏覽器的地址欄中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。但是對于傳遞數組或對象的話,就不能用這個方法了。下面…

RTMP協議中文翻譯(首發)(轉)

Adobe公司的實時消息傳輸協議 摘要 此備忘錄描述了 Adobe公司的實時消息傳輸協議(RTMP),此協議從屬于應用層,被設計用來在適合的傳輸協議(如TCP)上復用和打包多媒體傳輸流(如音頻、視頻和互動內容)。 目錄 …

關卡 動畫 藍圖 運行_UE4入門之路(基礎藍圖篇):藍圖的制作

藍圖系統簡介藍圖系統是UE4中十分有代表性的一個特點,所謂藍圖就是一種可視化的腳本。該系統非常靈活且非常強大,因為它為設計人員提供了一般僅供程序員使用的所有概念及工具。 程序員能夠很方便的創建一個基礎系統,并交給策劃進一步在藍圖中…

overfitting(過度擬合)的概念

來自:http://blog.csdn.net/fengzhe0411/article/details/7165549 最近幾天在看模式識別方面的資料,多次遇到“overfitting”這個概念,最終覺得以下解釋比較容易接受,就拿出來分享下。 overfittingt是這樣一種現象:一個…

虛擬串口服務器zenetmanager,Avocent服務器/串口管理 KVM

MergePoint Unity交換機在單個設備中結合了 KVM over IP和串行控制臺管理技術。這項獨特的結合為IT管理員提供了用于訪問和控制服務器、網絡設備及其他數據中心和分支辦公室設備的完整遠程管理解決方案。MergePoint Unity交換機直接與物理KVM、USB和串行端口進行安全的遠程帶外…

KAFKA分布式消息系統

Kafka[1]是linkedin用于日志處理的分布式消息隊列,linkedin的日志數據容量大,但對可靠性要求不高,其日志數據主要包括用戶行為(登錄、瀏覽、點擊、分享、喜歡)以及系統運行日志(CPU、內存、磁盤、網絡、系統…

jar打包 剔除第三方依賴以及它的依賴_面試官:為什么Spring Boot的jar可以直接運行?...

來源:Gormats Notesfangjian0423.github.io/2017/05/31/springboot-executable-jar/Spring Boot Loader抽象的一些類JarLauncher的執行過程關于自定義的類加載器LaunchedURLClassLoaderSpring Boot Loader的作用SpringBoot提供了一個插件spring-boot-maven-plugin用…

CQRS架構圖

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/darkness/blog/814243

SQLite中不支持的sql語法

今天很自然的在寫Sql語句的時候用了Top,一開始沒發現問題,因為我從數據庫讀出的值正好是0,而我習慣變量定義的時候也都賦值0,可是到我不要0的時候我就發現問題了。后來才知道,可愛的小sqlite竟然有不支持的sql語法。 看…

Analyzer普通用戶登錄不了[從網絡訪問此計算機]

問題: 最近客戶諾奇反映說Analyzer普通用戶登錄不了,但是發現管理員又可以登錄,幾經周折發現原來是系統的本地安全策略設置了不讓遠程使用本地賬戶密碼登錄系統導致。解決方案: 修改本地安全策略的“從遠程訪問此計算機”中的用戶…

金蝶系統服務器要求,金蝶服務器安裝及其相關要求.doc

K/3WISE創新管理平臺 V12.2標準部署環境說明目錄1. 多語言部署規則21.1 客戶端多語言部署規則21.2 中間層多語言部署規則31.3 數據庫多語言部署規則31.4 人力資源、管理門戶、CRM多語言部署規則41.5 Citrix遠程接入多語言部署規則42. 多語言部署架構圖52.1 簡體中間層52.2 繁體…

源碼 移植_FreeModbus移植總結

modbus是一項工業上經常用到的通訊協議,而freemodbus是一款開源的從機協議棧。關于它的移植網上已經有了很多的文章,但是大多都只是針對其中部分問題的表述。本文將會把自己在移植freemodbus過程中遇到的問題以及freemodbus的源碼分析盡量表述清楚。&…

expect腳本的簡單應用

expect是一個用來處理交互的命令。借助于expect我們可以把交互過程寫在一個腳本上,使之自動化完成。expect最核心的四個命令:send:用于向進程發送字符串 except:從進程接收字符串 spawn:打開一個新的進程 interact:保持交互的狀態首先一個簡單…

ajax中datatype是json,dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)

我有這個數據結構:var formValues {TemporaryToken: a.userStatus.get("TemporaryToken"),MemorableWordPositionAndValues:[{Position: a.userStatus.get("MemorableWordPositions")[0],Value: this.$([name"login-memorable-character-…

sqlserver 查詢中使用Union或Union All

在 程序人生網站上 看到了 這篇文章 就收藏了 哈 http://www.ourcodelife.com/article-415-1.html 首先,在程序人生網站上,需要負責任的指出的是在SQL Server查詢中使用Union或Union All后Order by排序無效,我不確認是不是微軟的bug&#xf…