簡體   English   中英

方法在哪里“生活”?

[英]Where do methods “live?”

如果每個對象都有不同的實例變量副本,則方法在哪里“存活”?

舉個例子:

class A {
    public foo() {
        System.out.println("foo");
    }
}

class B extends A {
    public foo() {
        System.out.println("foofoo");
    }
}

public class Main {
    public static void main(String[] args) {
        A a = new B();
        a.foo(); // "foofoo"
    }
}

我知道會打印“ foofoo”。 那么方法綁定到對象或其他東西了嗎?

您所指的過程稱為動態調度 通常通過虛擬表(通常稱為vtables)來實現此目的:

http://en.wikipedia.org/wiki/Virtual_table

關於vtables如何工作的簡單總結是,每種方法都存儲在某個內存地址中,而vtable存儲這些地址。 以您的示例為例, A的vtable的條目保存其版本foo的內存地址,而子類B的vtable的布局相同,但是它保存其foo的內存地址。

這通常是一個實現問題。 作為Java程序員,您需要關心的是每個類可以具有與其他類不同的方法。

就實現而言(如果您對秘密行為感興趣),最簡單的解決方案是讓每個類都有一個指向所有相關功能的指針。

這樣,當您使用B擴展A時,類型B的實例將獲得A的所有方法指針,但foo方法的指針指向B的代碼。

其中A圖形表示B延伸A ,只是覆蓋foo

class A
    foo ----------> Afoo code
    bar ----+-----> Abar code
class B     |
    bar ----+
    foo ----------> Bfoo code

類(對象)的實例知道它們的類型,因此您可以輕松地從對象b轉到類B 從那里開始,找到要運行的正確代碼是一個簡單的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM