构造方法的调用顺序和成员变量的初始化时机以及动态绑定
? ? ?構(gòu)造方法的調(diào)用順序:子類構(gòu)造器中,JVM會(huì)自動(dòng)的先調(diào)用父類的構(gòu)造方法,然后再執(zhí)行子類構(gòu)造方法。在JVM自動(dòng)調(diào)用父類構(gòu)造方法的時(shí)候,會(huì)完成父類中擁有的成員變量的值的初始化操作,此時(shí)子類的成員變量并未初始化,java中基本類型都會(huì)使用JVM給定的默認(rèn)值(如int為0),只有當(dāng)父類構(gòu)造方法調(diào)用結(jié)束,并到執(zhí)行子類構(gòu)造器時(shí)才會(huì)進(jìn)行子類成員變量的初始化過程。
? ? ?動(dòng)態(tài)綁定:對(duì)于非private、static、final修飾的方法,JVM是在運(yùn)行期間,用函數(shù)指針指向?qū)嵙?xí)對(duì)象類型的方法。比如,子類重寫了父類的A方法,使用父類Upper的引用upper指向了子類Sub對(duì)象,然后upper.A(),實(shí)際調(diào)用的類Sub中A方法。我是這樣理解的,子類和父類中都有方法A,并且子類是通過重寫的方式實(shí)現(xiàn)了A,所以子類對(duì)象原本Upper中指向方法A的指針和Sub類中指向A的指針是通過同一個(gè)函數(shù)指針,兩次賦值。就是指針point值被替換了,不是把父類的函數(shù)指針隱藏了,而是相當(dāng)于兩次給指針賦值,第一次使用父類A方法的指針賦給point,第二次使用子類A方法的指針賦給point(以上純屬自己的理解,如果不真確歡迎給位老師指點(diǎn),因?yàn)樽约哼€是剛?cè)胄?#xff09;。所以每一父類的方法的地址被子類方法的地址替換了。
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("父類構(gòu)造函數(shù)開始"); 13 System.out.println("i="+i); 14 print(); 15 System.out.println("父類構(gòu)造函數(shù)嗲用print()結(jié)束"); 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 }執(zhí)行結(jié)果:
父類構(gòu)造函數(shù)開始
i=1
父類構(gòu)造函數(shù)嗲用print()結(jié)束
成員變量j=20
j=20
j=40
?
轉(zhuǎn)載于:https://www.cnblogs.com/lingxiasandu/archive/2013/04/19/3029892.html
總結(jié)
以上是生活随笔為你收集整理的构造方法的调用顺序和成员变量的初始化时机以及动态绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HTML5初探之绘制图像(上)】看我c
- 下一篇: Analyzer普通用户登录不了[从网络