在JAVA類中使用super來引用父類的成分,用this來引用當前對象,若是一個類從另一個類繼承,咱們new這個子類的實例對象的時候,這個子類對象裏面會有一個父類對象。怎麼去引用裏面的父類對象呢?使用super來引用,this指的是當前對象的引用,super是當前對象裏面的父對象的引用。佈局
class Student { public int age; public void std(){ //聲明Student類的方法std() age = 15; System.out.println("學平生均年齡爲:"+age); } } class ThisStudent extends Student{ public int age; public void std(){ super.std(); //使用super做爲父類對象的引用對象來調用父類對象裏面的Std()方法 age = 18; System.out.println("這個學生的年齡爲:"+age); System.out.println(super.age); //使用super做爲父類對象的引用對象來調用父類對象中的age值 System.out.println(age); } } public class TestDif { public static void main(String[] args) { ThisStudent a = new ThisStudent(); a.std(); } }
執行結果:this
學平生均年齡爲:15
這個學生的年齡爲:18
15
18
ThisStudent a = new ThisStudent();spa
程序執行到這裏時,首先在棧空間裏面會產生一個變量a,a裏面的值是什麼這很差說,總而言之,經過這個值咱們能夠找到new出來的ThisStudent對象。因爲子類ThisStudent是從父類Student繼承下來的,因此當咱們new一個子類對象的時候,這個子類對象裏面會包含有一個父類對象,而這個父類對象擁有他自身的屬性age。這個age成員變量在Student類裏面聲明的時候並無對他進行初始化,因此係統默認給它初始化爲0,成員變量(在類裏面聲明)在聲明時能夠不給它初始化,編譯器會自動給這個成員變量初始化,但局部變量(在方法裏面聲明)在聲明時必定要給它初始化,由於編譯器不會自動給局部變量初始化,任何變量在使用以前必須對它進行初始化。對象
子類在繼承父類age屬性的同時,本身也單獨定義了一個age屬性,因此當咱們new出一個子類對象的時候,這個對象會有兩個age屬性,一個是從父類繼承下來的age,另外一個是本身的age。在子類裏定義的成員變量age在聲明時也沒有給它初始化,因此編譯器默認給它初始化爲0。所以,執行完第一句話之後,系統內存的佈局以下圖所示:blog
a.std();繼承
當new一個對象出來的時候,這個對象會產生一個this的引用,這個this引用指向對象自身。若是new出來的對象是一個子類對象的話,那麼這個子類對象裏面還會有一個super引用,這個super指向當前對象裏面的父對象。因此至關於程序裏面有一個this,this指向對象本身,還有一個super,super指向當前對象裏面的父對象。內存
這裏調用重寫以後的std()方法,方法體內的第一句話:「super.std();」是讓這個子類對象裏面的父對象本身調用本身的f()方法去改變本身age屬性的值,父對象經過指向他的引用super來調用本身的std()方法,因此執行完這一句之後,父對象裏面的age的值變成了15。接着執行「age=18;」這裏的age是子類對象本身聲明的value,不是從父類繼承下來的那個age。因此這句話執行完畢後,子類對象本身自己的age值變成了18。此時的內存佈局以下圖所示:get
方法體內的最後三句話都是執行打印age值的命令,前兩句打印出來的是子類對象本身的那個age值,所以打印出來的結果爲18,最後一句話打印的是這個子類對象裏面的父類對象本身的age值,打印出來的結果爲15。編譯器
到此,整個內存分析就結束了,最終內存顯示的結果如上面所示。編譯
(參考自孤傲蒼狼)