[英]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.