第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java父類方法中使用this,可以把this強轉(zhuǎn)為子類對象,然后調(diào)用子類的實例方法,怎么解釋?

java父類方法中使用this,可以把this強轉(zhuǎn)為子類對象,然后調(diào)用子類的實例方法,怎么解釋?

寶慕林4294392 2019-03-21 18:13:42
1.代碼如下父類代碼:public class A {public void a(){    B b=(B)this;    System.out.println(b.getNum());    System.out.println("A.this.hashCode="+this.hashCode());}}子類代碼:public class B extends A {public int num = 3;public int getNum() {    return num;}public void test() {    super.a();}public static void main(String[] args) {    B b=new B();    b.test();    System.out.println("b.hashCode="+b.hashCode());}}2.執(zhí)行結(jié)果3A.this.hashCode=412537538b.hashCode=412537538個人猜測在調(diào)用方法時,之前有看到過相關(guān)子類說,每個方法都隱式傳了當(dāng)前對象的this變量,因為子類是通過super調(diào)父類方法的,所以父類方法中的這個this應(yīng)該是子類實例對象,而且把各自對象的hashCode打印出來,是一樣的,不知道這樣猜測對不?4.這個問題在看jdk內(nèi)置觀察者模式框架代碼時,發(fā)現(xiàn)有個困惑的代碼,最后一行的this對象,源代碼如下:public void notifyObservers(Object arg) {    Object[] arrLocal;    synchronized (this) {        if (!changed)            return;        arrLocal = obs.toArray();        clearChanged();    }    for (int i = arrLocal.length - 1; i >= 0; i--)        ((Observer) arrLocal[i]).update(this, arg);}我們使用時,一般自定義主題類均繼承java.util.Observable,觀察者實現(xiàn)java.util.Observer,需要將update方法中的Observable對象變量,強轉(zhuǎn)成自定義主題類實例,調(diào)用主題類的相關(guān)方法。
查看完整描述

4 回答

?
喵喵時光機

TA貢獻1846條經(jīng)驗 獲得超7個贊

看到輸出結(jié)果這了,還是沒明白你的問題是什么.


查看完整回答
反對 回復(fù) 2019-04-23
?
手掌心

TA貢獻1942條經(jīng)驗 獲得超3個贊

Java中的方法調(diào)用是這樣的,比如說:


B b=new B();

b.test();//實際相當(dāng)于B.test(this)

//然后調(diào)用

super.a();//實際相當(dāng)于調(diào)用了A.a(this)

//所以,當(dāng)進入A類方法的時候this指向的還是B的對象

//你可以在super處打個斷點,看看super到底是什么東西


查看完整回答
反對 回復(fù) 2019-04-23
?
慕村9548890

TA貢獻1884條經(jīng)驗 獲得超4個贊

對于這種問題我傾向于將“類class”和“實例instance”分清楚討論。

this指向的是instance,你在A#a()方法里將this強制轉(zhuǎn)換成B類型的變量是完全合法的。
當(dāng)然到底這個時候this是不是B類型的還得在運行時判斷(這個JVM會判斷的)

所以也別管什么super、子類父類,你只需要看調(diào)用a()的時候,那個instance到底是什么類型就行了。


查看完整回答
反對 回復(fù) 2019-04-23
?
慕絲7291255

TA貢獻1859條經(jīng)驗 獲得超6個贊

你可以在寫個A的子類C,


public class C extends A {

    

    public void test() {

        super.a();

    }

    

    public static void main(String[] args) {

        new C().test();

    }

}

試試感覺如何


查看完整回答
反對 回復(fù) 2019-04-23
  • 4 回答
  • 0 關(guān)注
  • 1257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號