您好,登錄后才能下訂單哦!
一、super關(guān)鍵字
在JAVA類中使用super來引用父類的成分,用this來引用當(dāng)前對(duì)象,如果一個(gè)類從另外一個(gè)類繼承,我們new這個(gè)子類的實(shí)例對(duì)象的時(shí)候,這個(gè)子類對(duì)象里面會(huì)有一個(gè)父類對(duì)象。怎么去引用里面的父類對(duì)象呢?使用super來引用,this指的是當(dāng)前對(duì)象的引用,super是當(dāng)前對(duì)象里面的父對(duì)象的引用。
super關(guān)鍵字測(cè)試
package com.bjpowernode.test; /** * 父類 * * */ class FatherClass { public int value; public void f() { value=100; System.out.println("父類的value屬性值="+value); } } /** * 子類ChildClass從父類FatherClass繼承 * * */ class ChildClass extends FatherClass { /** * 子類除了繼承父類所具有的valu屬性外,自己又另外聲明了一個(gè)value屬性, * 也就是說,此時(shí)的子類擁有兩個(gè)value屬性。 */ public int value; /** * 在子類ChildClass里面重寫了從父類繼承下來的f()方法里面的實(shí)現(xiàn),即重寫了f()方法的方法體。 */ public void f() { super.f();//使用super作為父類對(duì)象的引用對(duì)象來調(diào)用父類對(duì)象里面的f()方法 value=200;//這個(gè)value是子類自己定義的那個(gè)valu,不是從父類繼承下來的那個(gè)value System.out.println("子類的value屬性值="+value); System.out.println(value);//打印出來的是子類自定義的那個(gè)value的值,這個(gè)值是200 /** * 打印出來的是父類里面的value值,由于子類在重寫從父類繼承下來的f()方法時(shí), * 第一句話“super.f();”是讓父類對(duì)象的引用對(duì)象調(diào)用父類對(duì)象的f()方法, * 即相當(dāng)于是這個(gè)父類對(duì)象自己調(diào)用f()方法去改變自己的value屬性的值,由0變了100。 * 所以這里打印出來的value值是100。 */ System.out.println(super.value); } } /** * 測(cè)試類 * * */ public class TestInherit { public static void main(String[] args) { ChildClass cc = new ChildClass(); cc.f(); } }
運(yùn)行結(jié)果:
畫內(nèi)存分析圖了解程序執(zhí)行的整個(gè)過程
分析任何程序都是從main方法的第一句開始分析的,所以首先分析main方法里面的第一句話:
ChlidClass cc = new ChlidClass();
程序執(zhí)行到這里時(shí),首先在棧空間里面會(huì)產(chǎn)生一個(gè)變量cc,cc里面的值是什么這不好說,總而言之,通過這個(gè)值我們可以找到new出來的ChlidClass對(duì)象。由于子類ChlidClass是從父類FatherClass繼承下來的,所以當(dāng)我們new一個(gè)子類對(duì)象的時(shí)候,這個(gè)子類對(duì)象里面會(huì)包含有一個(gè)父類對(duì)象,而這個(gè)父類對(duì)象擁有他自身的屬性value。這個(gè)value成員變量在FatherClass類里面聲明的時(shí)候并沒有對(duì)他進(jìn)行初始化,所以系統(tǒng)默認(rèn)給它初始化為0,成員變量(在類里面聲明)在聲明時(shí)可以不給它初始化,編譯器會(huì)自動(dòng)給這個(gè)成員變量初始化,但局部變量(在方法里面聲明)在聲明時(shí)一定要給它初始化,因?yàn)榫幾g器不會(huì)自動(dòng)給局部變量初始化,任何變量在使用之前必須對(duì)它進(jìn)行初始化。
子類在繼承父類value屬性的同時(shí),自己也單獨(dú)定義了一個(gè)value屬性,所以當(dāng)我們new出一個(gè)子類對(duì)象的時(shí)候,這個(gè)對(duì)象會(huì)有兩個(gè)value屬性,一個(gè)是從父類繼承下來的value,另一個(gè)是自己的value。在子類里定義的成員變量value在聲明時(shí)也沒有給它初始化,所以編譯器默認(rèn)給它初始化為0。因此,執(zhí)行完第一句話以后
接下來執(zhí)行第二句話:
cc.f();
當(dāng)new一個(gè)對(duì)象出來的時(shí)候,這個(gè)對(duì)象會(huì)產(chǎn)生一個(gè)this的引用,這個(gè)this引用指向?qū)ο笞陨怼H绻鹡ew出來的對(duì)象是一個(gè)子類對(duì)象的話,那么這個(gè)子類對(duì)象里面還會(huì)有一個(gè)super引用,這個(gè)super指向當(dāng)前對(duì)象里面的父對(duì)象。所以相當(dāng)于程序里面有一個(gè)this,this指向?qū)ο笞约?,還有一個(gè)super,super指向當(dāng)前對(duì)象里面的父對(duì)象。
這里調(diào)用重寫之后的f()方法,方法體內(nèi)的第一句話:“super.f();”是讓這個(gè)子類對(duì)象里面的父對(duì)象自己調(diào)用自己的f()方法去改變自己value屬性的值,父對(duì)象通過指向他的引用super來調(diào)用自己的f()方法,所以執(zhí)行完這一句以后,父對(duì)象里面的value的值變成了100。接著執(zhí)行“value=200;”這里的vaule是子類對(duì)象自己聲明的value,不是從父類繼承下來的那個(gè)value。所以這句話執(zhí)行完畢后,子類對(duì)象自己本身的value值變成了200。此時(shí)的內(nèi)存布局如下圖所示:
方法體內(nèi)的最后三句話都是執(zhí)行打印value值的命令,前兩句打印出來的是子類對(duì)象自己的那個(gè)value值,因此打印出來的結(jié)果為200,最后一句話打印的是這個(gè)子類對(duì)象里面的父類對(duì)象自己的value值,打印出來的結(jié)果為100。
到此,整個(gè)內(nèi)存分析就結(jié)束了,最終內(nèi)存顯示的結(jié)果如上面所示。
以上所述是小編給大家介紹的Java中的super關(guān)鍵字_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。