Java接口和内存分配

4

请考虑:

public SomeClass implements SomeInterface{...}

SomeClass obj = new SomeClass();

SomeInterface x = obj;

我试图将第三行与我对内存管理的基本理解联系起来。 我知道“obj”所代表的内存位置只包含指向SomeClass内存位置的指针。假设我使用的是64位JVM,那么最多分配64位用于“obj”指针。当JRE实现x时,在内存中创建了什么?它只是一个指向SomeClass的64位指针吗?


是的,x 也只是指向同一对象的引用。 - Vincent Ramdhanie
3个回答

3

无论您如何声明,每个对象引用占用的内存空间都相同。

因此,xobj是两个不同的引用,它们恰好指向相同的东西。


1
每个对象引用在CompressedOops下占用相同的内存空间,这是严格正确的吗?https://wikis.oracle.com/display/HotSpotInternals/CompressedOops - NPE
@NPE 如果你深入到足够深的程度,许多简单的真理都不成立。比如,现实世界中的物体并没有真正的颜色等等。但是为了回答这个问题,我认为我的说法是正确的。 - barfuin
那么,将x声明为SomeInterface类型的目的是什么呢?为什么不直接说SomeClass x = obj; 这两个语句是否完全相同? - James Rogers
一般来说,你应该使用对象的接口类型来声明,这样你就可以在不改变代码的情况下将实现类替换为其他类(例如,HashSetTreeSet都是Set)。不过这是另一个问题了。 - barfuin
@Thomas,如果我理解正确的话,您是在说接口的优点是我可以这样做吗?SomeOtherClass实现SomeInterface{...} SomeOtherClass someOtherObj = new SomeOtherClass(); x = someOtherObj; - James Rogers

1

在Java中,引用占用相同的内存,无论是如何声明的。

堆栈和堆内存分配这将帮助您详细了解它的工作原理。

enter image description here


谢谢你提供的链接,我会仔细阅读。 - James Rogers

0

实际上没有内存开销,此时SomeInterface声明只是一种语言结构,用于在稍后由编译器检查x的类型。


你是说 x 占用零存储空间,包括引用本身的存储空间都没有? - NPE
不,变量有存储空间,但它与任何其他引用没有区别。它是接口的事实并不改变这一点。 - Will Hartung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接