gpt4 book ai didi

java - 实现接口(interface)的 Java 对象如何存储在内存中?

转载 作者:行者123 更新时间:2023-12-01 13:47:52 24 4
gpt4 key购买 nike

Java 没有类的多重继承,但它确实支持一个类的多个接口(interface)实现。

据我了解,当Java类继承另一个类时,它的内存表示是这样的:

class Base {
int x;
}

class Deriving {
int y;
}
Base在内存中:
vtable|Base.x
Deriving在内存中:
vtable|Base.x|Deriving.y
Deriving 在这里一切看起来都很清晰必须拥有所有字段 Base有和所有 Deriving的字段存储在 Base 之后的那些。

但是当类实现接口(interface)时会发生什么?
例如,我们有以下接口(interface),它们定义了相同的变量和一个类:
public interface Y {
int x = 0; // both Y and Z have this field
int y = 0;
void methodY();
}

public interface Z {
int x = 0; // both Y and Z have this field
int z = 0;
void methodZ();
}

public class A implements Y, Z {
int a;
int x;
int y;
int z;
public A(int x, int a) {
this.x = x;
this.a = a;
}

public void methodY() {
System.out.println("methodY: x = " + x + ", a = " + a);
}

public void methodZ() {
System.out.println("methodZ: x = " + x + ", a = " + a);
}
}

当我们有以下情况时会发生什么:
A a = new A(5, 6);
Y y = a;
Z z = a;

做什么 yz指向 a的内容以及如何做看起来像? vtable 的外观如何,它们包含什么?

我唯一能猜到的是它在内存中可能看起来像这样:
A.vtable|A.a|Y.vtable|Y.x|Y.y
^ a ^ y

意思是 a指向开头和 y指向对象的中间。但是我仍然无法弄清楚接口(interface)如何共享一个字段。

最佳答案

  • 接口(interface)没有字段。这应该使内存布局更容易。
  • 内存布局将使每个 vtable 位于内存中的不同位置。请记住,vtables 本身没有方法实现,而是对方法在内存中开始位置的引用。这允许所有方法都位于相对于 vtable 开头的正确位置。
  • 关于java - 实现接口(interface)的 Java 对象如何存储在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546927/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com