亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

是否可以說每個運行時綁定都是編譯期間的靜態綁定?

是否可以說每個運行時綁定都是編譯期間的靜態綁定?

慕田峪7331174 2023-09-13 18:03:39
我對主題綁定很困惑。正如我們所知,在靜態綁定中,會檢查引用的類型來確定綁定,而不是它所引用的對象,而在動態綁定中,會考慮引用所指向的對象的類型。class A{    void show()    {        System.out.println("From A");    }}class B extends A{    void show()    {        System.out.println("From B");    }}class Main{    public static void main(String[] quora)    {        A a1 = new A();        A a2 = new B();        a1.show(); //line 1        a2.show(); //line 2    }}在上面的例子中,我們可以看到在編譯時,Line1和line2都將被靜態綁定處理,并且它們將鏈接到A類方法show(因為引用的類型是A)。但在運行時,調用被解析,line1 鏈接到 A 類方法 show(),line2 鏈接到 B 類方法,即對象類型,或者我們可以說動態綁定。所以我的主要目的是了解以下內容。動態綁定總是在靜態綁定之后產生嗎?或者我理解有問題?如果這是真的,那么每個方法在運行時都是動態鏈接的說法是真的嗎?我們可以概括一下嗎?
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

基本上,每次調用方法時,編譯器都必須根據傳遞給方法的類型和參數來確定要調用哪個重載。這是靜態綁定。然后在運行時,運行時將確定要調用哪個重載實現(此時已經決定)。


考慮:


class A

{

    void f(Object o)

    {

        System.out.println("From A");

    }

}

class B extends A

{


    void f(Object o)

    {

        System.out.println("From B (Object)");

    }


    void f(String s)

    {

        System.out.println("From B (String)");

    }

}

你也是:


A a = new B();

a.f("");

會發生什么?f(Object)在編譯時,編譯器根據a存在的類型選擇了重載A(只有一種方法可供選擇!)。然后在運行時,由于a實際上引用了 的實例B,因此調用重載B的實現,打印。我見過的一種誤解是期望輸出為. 這是錯誤的,因為編譯器不知道.f(Object)From B (Object)From B (String)a

動態綁定總是在靜態綁定之后產生嗎?

從上面代碼的結果我們可以看出,答案是肯定的。靜態綁定發生在編譯時,動態綁定發生在運行時,因此前者總是先發生。

如果這是真的,那么每個方法在運行時都是動態鏈接的說法是真的嗎?

我不確定你的意思,所以希望上面的詳細解釋已經回答了這個問題。

不管怎樣,每次方法調用總是會有靜態綁定,然后動態綁定?

是的,但有時這兩個過程可能會進行得很快,因為選擇很少。當您調用方法的類是最終類時,您可能不需要在動態綁定中做出“選擇”,是嗎?


查看完整回答
反對 回復 2023-09-13
  • 1 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號