在JAVA類中使用super來引用父類的成分,用this來引用當前對象,若是一個類從另一個類繼承,咱們new這個子類的實例對象的時候,這個子類對象裏面會有一個父類對象。怎麼去引用裏面的父類對象呢?使用super來引用,this指的是當前對象的引用,super是當前對象裏面的父對象的引用。佈局
1 package cn.galc.test; 2 3 /** 4 * 父類 5 * @author gacl 6 * 7 */ 8 class FatherClass { 9 public int value; 10 public void f() { 11 value=100; 12 System.out.println("父類的value屬性值="+value); 13 } 14 } 15 16 /** 17 * 子類ChildClass從父類FatherClass繼承 18 * @author gacl 19 * 20 */ 21 class ChildClass extends FatherClass { 22 /** 23 * 子類除了繼承父類所具備的valu屬性外,本身又另外聲明瞭一個value屬性, 24 * 也就是說,此時的子類擁有兩個value屬性。 25 */ 26 public int value; 27 /** 28 * 在子類ChildClass裏面重寫了從父類繼承下來的f()方法裏面的實現,即重寫了f()方法的方法體。 29 */ 30 public void f() { 31 super.f();//使用super做爲父類對象的引用對象來調用父類對象裏面的f()方法 32 value=200;//這個value是子類本身定義的那個valu,不是從父類繼承下來的那個value 33 System.out.println("子類的value屬性值="+value); 34 System.out.println(value);//打印出來的是子類自定義的那個value的值,這個值是200 35 /** 36 * 打印出來的是父類裏面的value值,因爲子類在重寫從父類繼承下來的f()方法時, 37 * 第一句話「super.f();」是讓父類對象的引用對象調用父類對象的f()方法, 38 * 即至關因而這個父類對象本身調用f()方法去改變本身的value屬性的值,由0變了100。 39 * 因此這裏打印出來的value值是100。 40 */ 41 System.out.println(super.value); 42 } 43 } 44 45 /** 46 * 測試類 47 * @author gacl 48 * 49 */ 50 public class TestInherit { 51 public static void main(String[] args) { 52 ChildClass cc = new ChildClass(); 53 cc.f(); 54 } 55 }
運行結果:測試
分析任何程序都是從main方法的第一句開始分析的,因此首先分析main方法裏面的第一句話:
this
ChlidClass cc = new ChlidClass();
程序執行到這裏時,首先在棧空間裏面會產生一個變量cc,cc裏面的值是什麼這很差說,總而言之,經過這個值咱們能夠找到new出來的ChlidClass對象。因爲子類ChlidClass是從父類FatherClass繼承下來的,因此當咱們new一個子類對象的時候,這個子類對象裏面會包含有一個父類對象,而這個父類對象擁有他自身的屬性value。這個value成員變量在FatherClass類裏面聲明的時候並無對他進行初始化,因此係統默認給它初始化爲0,成員變量(在類裏面聲明)在聲明時能夠不給它初始化,編譯器會自動給這個成員變量初始化,但局部變量(在方法裏面聲明)在聲明時必定要給它初始化,由於編譯器不會自動給局部變量初始化,任何變量在使用以前必須對它進行初始化。spa
子類在繼承父類value屬性的同時,本身也單獨定義了一個value屬性,因此當咱們new出一個子類對象的時候,這個對象會有兩個value屬性,一個是從父類繼承下來的value,另外一個是本身的value。在子類裏定義的成員變量value在聲明時也沒有給它初始化,因此編譯器默認給它初始化爲0。所以,執行完第一句話之後,系統內存的佈局以下圖所示:code
接下來執行第二句話:對象
1 cc.f();
當new一個對象出來的時候,這個對象會產生一個this的引用,這個this引用指向對象自身。若是new出來的對象是一個子類對象的話,那麼這個子類對象裏面還會有一個super引用,這個super指向當前對象裏面的父對象。因此至關於程序裏面有一個this,this指向對象本身,還有一個super,super指向當前對象裏面的父對象。blog
這裏調用重寫以後的f()方法,方法體內的第一句話:「super.f();」是讓這個子類對象裏面的父對象本身調用本身的f()方法去改變本身value屬性的值,父對象經過指向他的引用super來調用本身的f()方法,因此執行完這一句之後,父對象裏面的value的值變成了100。接着執行「value=200;」這裏的vaule是子類對象本身聲明的value,不是從父類繼承下來的那個value。因此這句話執行完畢後,子類對象本身自己的value值變成了200。此時的內存佈局以下圖所示:繼承
方法體內的最後三句話都是執行打印value值的命令,前兩句打印出來的是子類對象本身的那個value值,所以打印出來的結果爲200,最後一句話打印的是這個子類對象裏面的父類對象本身的value值,打印出來的結果爲100。內存
到此,整個內存分析就結束了,最終內存顯示的結果如上面所示。編譯器