java - 为什么对象分配引用内存位置,而基本类型则不然?

标签 java object variable-assignment primitive

关于原始类型在 Java 中如何工作,我有一个奇怪的问题。当使用对象时,当您将 ObjectA 分配给 ObjectB 时,就像这样

Rectangle ObjectB = new Rectangle();
ObjectA = ObjectB;

对 ObjectA 的任何调用现在都会引用 ObjectB 的内存位置。然而,当使用整数或其他基本类型时,情况并非如此。例如

int x = 3;
int y = x;
int x = 5;
return y;

y 将返回 3,即 y 初始化时 x 的值。

我的问题是为什么对象的赋值会在内存中创建引用,而基元会复制彼此的值?除了这很有用之外,它在 Java 中是如何实现的?

如果有人能让我更好地理解基本类型和对象之间的赋值工作原理,我将不胜感激。

最佳答案

无论变量是原始类型还是引用类型,都会执行完全相同的操作:变量中保存的将复制到另一个变量。

唯一的区别是,具有引用类型的变量中保存的值是对实际事物(对象)的引用,而不是实际事物本身,而变量中的值原始类型实际的东西(原始值)。

假设你有:

int a = 5;

这有点像 Joe 有一张纸(变量 a),上面写着 5。

现在:

int b = a;

a 中的被复制到b中。这有点像玛丽过来,拿出一张纸,抄下乔纸上的内容(数字 5)。

现在,假设你有:

Map a = new HashMap();

这有点像乔有一张写有他的地址的纸。这张纸是变量aHashMap 对象是他的房子。

现在:

Map b = a;

a 中的被复制到b中。这就像玛丽走过来,拿出一张纸,将乔的地址从他的纸上抄下来。 房子尚未被复制,只是有关其位置的信息。

这就是对象引用:告诉 JVM 对象在内存中的位置的信息(如数字)。

我会详细介绍一下 in this answer (Java)和this one (这是关于 JavaScript 的,但是值、变量和对象引用的概念在两种语言 [以及许多其他语言] 中是相同的)。

关于java - 为什么对象分配引用内存位置,而基本类型则不然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952927/

相关文章:

java 不返回void的虚方法

java - 在 Windows Server 2008 上卸载 JRE

java - 根据给定值和父 ID 创建树

javascript - 如何在 JavaScript 中将对象传递给动画函数?

c - C 中奇怪的变量赋值

c++ - 复合赋值 E1 op= E2 不等同于 E1 = E1 op E2

java - 从 void 方法返回数组

javascript - 如何从对象字面量中获取属性的计数?

scala - 为什么在 Play Framework 中使用 @Singleton 而不是 Scala 的对象?

c - 赋值使指针无需强制转换