久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 方(fang)法和變量在繼承(cheng)時的覆蓋和隱藏問題

方法和變量(liang)在繼承(cheng)時的覆(fu)蓋和隱藏問題 時間:2018-09-21      來源:未知

近有(you)個(ge)同(tong)學問(wen)(wen)了我一個(ge)小(xiao)問(wen)(wen)題,覺得很有(you)意思,之前一直沒有(you)想(xiang)到過。他說(shuo)“java中(zhong)存在方(fang)法(fa)(fa)覆(fu)(fu)蓋,是否存在變量的覆(fu)(fu)蓋呢?”。我們知(zhi)道,在java中(zhong),子類可以繼承父類,如果子類聲(sheng)明的方(fang)法(fa)(fa)與(yu)父類有(you)重名,這(zhe)(zhe)時(shi)就(jiu)發生了方(fang)法(fa)(fa)覆(fu)(fu)蓋。其實,這(zhe)(zhe)實際上這(zhe)(zhe)又分(fen)為兩種情況,就(jiu)是方(fang)法(fa)(fa)和變量在繼承時(shi)的覆(fu)(fu)蓋和隱藏問(wen)(wen)題,這(zhe)(zhe)些概念性(xing)的東西看似無(wu)聊(liao),但是在面(mian)試中(zhong)還是比較常見的,所以這(zhe)(zhe)里來討論下

首(shou)先我(wo)們來看(kan)幾個概念

隱(yin)藏(zang)(zang) :子(zi)類(lei)隱(yin)藏(zang)(zang)了(le)父類(lei)的變(bian)量和方(fang)法,那么,子(zi)類(lei)不能訪問父類(lei)被隱(yin)藏(zang)(zang)的變(bian)量或者(zhe)方(fang)法,但是,將子(zi)類(lei)轉換成父類(lei),可以(yi)訪問父類(lei)被隱(yin)藏(zang)(zang)的變(bian)量或者(zhe)方(fang)法

覆蓋 :子類(lei)(lei)(lei)覆蓋了父(fu)(fu)類(lei)(lei)(lei)的(de)變(bian)量(liang)或(huo)者方法,那(nei)么,子類(lei)(lei)(lei)不(bu)(bu)能訪(fang)問父(fu)(fu)類(lei)(lei)(lei)被覆蓋的(de)變(bian)量(liang)或(huo)者方法,將(jiang)子類(lei)(lei)(lei)轉換(huan)成父(fu)(fu)類(lei)(lei)(lei)后同樣不(bu)(bu)能訪(fang)問父(fu)(fu)類(lei)(lei)(lei)被覆蓋的(de)變(bian)量(liang)或(huo)者方法

首先看一下(xia)JAVA中方法(fa)和(he)變量在繼承時的覆蓋(gai)和(he)隱藏規則

1.父類(lei)的(de)(de)實(shi)例變(bian)量和(he)靜態變(bian)量能被子類(lei)的(de)(de)同名變(bian)量隱藏

2.父類(lei)的靜態(tai)方法被子(zi)類(lei)的同名靜態(tai)方法隱藏(zang)

3.父類的(de)實例方法被子類的(de)同名(ming)實例變量覆(fu)蓋

還(huan)有幾點(dian)需(xu)要注意的(de)是

1.不能用(yong)子(zi)類的(de)靜態方(fang)法隱藏 父(fu)類中(zhong)同樣(yang)標示(也就是返回值 名(ming)字 參數都一樣(yang))的(de)實例方(fang)法

2.不能用子類的實(shi)例方(fang)法覆蓋 父類中同樣標示的靜態方(fang)法

3.這點兒請注意,就是(shi)(shi)變量(liang)只會被隱藏 不會被覆(fu)蓋 ,無論(lun)他是(shi)(shi)實例變量(liang)還是(shi)(shi)靜(jing)態(tai)變量(liang),而且(qie),子類(lei)的(de)靜(jing)態(tai)變量(liang)可(ke)以(yi)隱藏 父(fu)類(lei)的(de)實例變量(liang),子類(lei)的(de)實例變量(liang)可(ke)以(yi)隱藏 父(fu)類(lei)的(de)靜(jing)態(tai)變量(liang)

創建(jian)兩(liang)個父子(zi)類關(guan)系的類

Java代碼

//父類

class Parent

{

public static String kind="cn.com.farsight.parent";

public static int age=50;

public String name="Parent";

//靜態方法,返回包名

public static String getKind()

{

System.out.println("parent的getKind()方法被調用了");

return kind;

}

//靜態方(fang)法(fa),返(fan)回年齡

public static int getAge()

{

System.out.println("Parent的getAge()方法被調用了");

return age;

}

//實例方法(fa),返回姓名

public String getName()

{

System.out.println("Parent的getName()方法被(bei)調用了(le)");

return this.name;

}

}

//子類

class Child extends Parent

{

public static String kind="cn.com.farsight.child";

public int age=25;

public String name="child";

//隱藏父(fu)類(lei)靜(jing)態方法

public static String getKind()

{

System.out.println("child的getkind()方法被調用了");

return kind;

}

//獲取父類包名(ming)

public static String getParentKind()

{

return Parent.kind;

}

//覆蓋(gai)父類(lei)實例(li)方法

public String getName()

{

System.out.println("child的getName()被調用了(le)");

return this.name;

}

//獲取父類名稱

public String getParentName()

{

return super.name;

}

/*

*錯誤,實例方(fang)(fang)法不(bu)能覆蓋父(fu)類的靜態方(fang)(fang)法

public int getAge()

{

return this.age;

}

*/

}

class TestDemo

{

public static void main(String[] args)

{

Child child=new Child();

System.out.printf("子(zi)類(lei)名稱:%s,年齡:%d,包名:%s%n",child.name,child.age,child.kind);

//輸出:子(zi)類名稱(cheng):child,年齡:25,包:cn.com.farsight.child

//把child轉(zhuan)換(huan)成(cheng)parent對象

Parent parent=child;

System.out.printf("轉換后的名稱:%s,年齡(ling):%d,包(bao)名:%s%n",parent.name,parent.age,parent.kind);

//輸出:轉換(huan)后的(de)名稱:Parent,年齡:50,包:cn.com.farsight.parent

System.out.printf("子類訪問父類被隱藏(zang)的實例(li)變量(liang)name:%s%n",child.getParentName());

//輸出:子(zi)類訪(fang)問(wen)父類被(bei)隱藏的實例變(bian)量name:Parent

System.out.printf("子類(lei)訪問父(fu)類(lei)被(bei)隱藏的靜態變量(liang)kind:%s",child.getParentKind());

//輸出:子類(lei)訪問父(fu)類(lei)被隱(yin)藏的靜態變量kind:cn.com.farsight.parent

child.getName();

//輸(shu)出:child的getName()被調用了

//**************注(zhu)意看這(zhe)個方法,返(fan)回的還是子(zi)類的getName

parent.getName();

//輸出:child的getName()被調用(yong)了(le)

child.getKind();

//輸出:child的getkind()方法被調用了(le)

parent.getKind();

//輸出(chu):parent的getKind()方(fang)法被(bei)調用(yong)了

}

}

總結:

1.同名的(de)實(shi)例方(fang)(fang)(fang)法(fa)(fa)被(bei)覆蓋(gai) ,同名的(de)靜(jing)態方(fang)(fang)(fang)法(fa)(fa)被(bei)隱藏 ,child類的(de)getName實(shi)例方(fang)(fang)(fang)法(fa)(fa)覆蓋(gai) 了(le)parent的(de)getName實(shi)例方(fang)(fang)(fang)法(fa)(fa),chind的(de)getKind方(fang)(fang)(fang)法(fa)(fa)隱藏了(le)parent類的(de)getKind方(fang)(fang)(fang)法(fa)(fa)

2.隱藏和覆蓋(gai)的區別在于,子類對(dui)象轉換成父類對(dui)象后,能夠訪問父類被(bei)隱藏 的變量和方法,而不能訪問父類被(bei)覆蓋(gai)的方法

3.如果需要(yao)訪(fang)問(wen)父類(lei)被隱藏的實(shi)例變量,加上super就好了,比如訪(fang)問(wen)父類(lei)name,使用super.name

上一篇:STM32F407和STM32F051主從I2C通信

下一篇:關于使用stm32cubemx生成代碼后移植Ucos—III的方法

熱點文章推(tui)薦
華清學員就(jiu)業榜單
高薪學員(yuan)經驗分享
熱點新聞(wen)推(tui)薦
前臺專線(xian):010-82525158 企業培訓洽談專線:010-82525379 院校合作(zuo)洽談專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部