java 關(guān)鍵字super詳解及用法
java 關(guān)鍵字super詳解
一、super關(guān)鍵字
在JAVA類中使用super來引用父類的成分,用this來引用當(dāng)前對象,如果一個類從另外一個類繼承,我們new這個子類的實例對象的時候,這個子類對象里面會有一個父類對象。怎么去引用里面的父類對象呢?使用super來引用,this指的是當(dāng)前對象的引用,super是當(dāng)前對象里面的父對象的引用。
1.1.super關(guān)鍵字測試
package cn.galc.test; /** * 父類 * @author gacl * */ class FatherClass { public int value; public void f() { value=100; System.out.println("父類的value屬性值="+value); } } /** * 子類ChildClass從父類FatherClass繼承 * @author gacl * */ class ChildClass extends FatherClass { /** * 子類除了繼承父類所具有的valu屬性外,自己又另外聲明了一個value屬性, * 也就是說,此時的子類擁有兩個value屬性。 */ public int value; /** * 在子類ChildClass里面重寫了從父類繼承下來的f()方法里面的實現(xiàn),即重寫了f()方法的方法體。 */ public void f() { super.f();//使用super作為父類對象的引用對象來調(diào)用父類對象里面的f()方法 value=200;//這個value是子類自己定義的那個valu,不是從父類繼承下來的那個value System.out.println("子類的value屬性值="+value); System.out.println(value);//打印出來的是子類自定義的那個value的值,這個值是200 /** * 打印出來的是父類里面的value值,由于子類在重寫從父類繼承下來的f()方法時, * 第一句話“super.f();”是讓父類對象的引用對象調(diào)用父類對象的f()方法, * 即相當(dāng)于是這個父類對象自己調(diào)用f()方法去改變自己的value屬性的值,由0變了100。 * 所以這里打印出來的value值是100。 */ System.out.println(super.value); } } /** * 測試類 * @author gacl * */ public class TestInherit { public static void main(String[] args) { ChildClass cc = new ChildClass(); cc.f(); } }
運行結(jié)果:
1.2. 畫內(nèi)存分析圖了解程序執(zhí)行的整個過程
分析任何程序都是從main方法的第一句開始分析的,所以首先分析main方法里面的第一句話:
ChlidClass cc = new ChlidClass();
程序執(zhí)行到這里時,首先在棧空間里面會產(chǎn)生一個變量cc,cc里面的值是什么這不好說,總而言之,通過這個值我們可以找到new出來的ChlidClass對象。由于子類ChlidClass是從父類FatherClass繼承下來的,所以當(dāng)我們new一個子類對象的時候,這個子類對象里面會包含有一個父類對象,而這個父類對象擁有他自身的屬性value。這個value成員變量在FatherClass類里面聲明的時候并沒有對他進行初始化,所以系統(tǒng)默認(rèn)給它初始化為0,成員變量(在類里面聲明)在聲明時可以不給它初始化,編譯器會自動給這個成員變量初始化,但局部變量(在方法里面聲明)在聲明時一定要給它初始化,因為編譯器不會自動給局部變量初始化,任何變量在使用之前必須對它進行初始化。
子類在繼承父類value屬性的同時,自己也單獨定義了一個value屬性,所以當(dāng)我們new出一個子類對象的時候,這個對象會有兩個value屬性,一個是從父類繼承下來的value,另一個是自己的value。在子類里定義的成員變量value在聲明時也沒有給它初始化,所以編譯器默認(rèn)給它初始化為0。因此,執(zhí)行完第一句話以后,
接下來執(zhí)行第二句話:
1 cc.f();
當(dāng)new一個對象出來的時候,這個對象會產(chǎn)生一個this的引用,這個this引用指向?qū)ο笞陨?。如果new出來的對象是一個子類對象的話,那么這個子類對象里面還會有一個super引用,這個super指向當(dāng)前對象里面的父對象。所以相當(dāng)于程序里面有一個this,this指向?qū)ο笞约?,還有一個super,super指向當(dāng)前對象里面的父對象。
這里調(diào)用重寫之后的f()方法,方法體內(nèi)的第一句話:“super.f();”是讓這個子類對象里面的父對象自己調(diào)用自己的f()方法去改變自己value屬性的值,父對象通過指向他的引用super來調(diào)用自己的f()方法,所以執(zhí)行完這一句以后,父對象里面的value的值變成了100。接著執(zhí)行“value=200;”這里的vaule是子類對象自己聲明的value,不是從父類繼承下來的那個value。所以這句話執(zhí)行完畢后,子類對象自己本身的value值變成了200。
方法體內(nèi)的最后三句話都是執(zhí)行打印value值的命令,前兩句打印出來的是子類對象自己的那個value值,因此打印出來的結(jié)果為200,最后一句話打印的是這個子類對象里面的父類對象自己的value值,打印出來的結(jié)果為100。
到此,整個內(nèi)存分析就結(jié)束了
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
tomcat報錯:Wrapper cannot find servlet class ...問題解決
這篇文章主要介紹了tomcat報錯:Wrapper cannot find servlet class ...問題解決的相關(guān)資料,需要的朋友可以參考下2016-11-11關(guān)于使用Mybatisplus自帶的selectById和insert方法時的一些問題
這篇文章主要介紹了關(guān)于使用Mybatisplus自帶的selectById和insert方法時的一些問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08利用Spring Validation實現(xiàn)輸入驗證功能
這篇文章主要給大家介紹了如何利用Spring Validation完美的實現(xiàn)輸入驗證功能,文中有詳細(xì)的代碼示例,具有一定的參考價值,感興趣的朋友可以借鑒一下2023-06-06POI導(dǎo)出Excel報錯No such file or directory的解決方法
這篇文章主要為大家詳細(xì)介紹了POI導(dǎo)出Excel報錯No such file or directory的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Spring Cloud 部署時使用 Kubernetes 作為注冊中心和配置中
Spring Cloud Kubernetes提供了使用Kubernete本地服務(wù)的Spring Cloud通用接口實現(xiàn),這篇文章主要介紹了Spring Cloud 部署時如何使用 Kubernetes 作為注冊中心和配置中心,需要的朋友可以參考下2024-05-05Springboot+Vue+shiro實現(xiàn)前后端分離、權(quán)限控制的示例代碼
這篇文章主要介紹了Springboot+Vue+shiro實現(xiàn)前后端分離、權(quán)限控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07