我最近读了这篇文章:Is Java "pass-by-reference" or "pass-by-value"?
第一个答案过于简洁和具体,无法让我有明确的理解,其他人都写了 15 页的文章来解释什么应该是一个简单的主题。以下规则是否正确(如果为真,则非常简单):
1.) 与非基元类型关联的命名事物(Java 中的“对象引用”)在 C++ 中是指针。
2.)。在 Java 指针上使用 -> 与在 C++ 指针上使用相同。
3.) 在 Java 指针上使用 = 与在 C++ 指针上使用 = 相同。
4.) 所有函数都按值传递(因此按值传递 Java 指针)。
(这忽略了内存管理差异,例如 = 在 Java 指针上很好,而 = 在 C++ 指针上意味着您可能需要担心内存管理)
这个难题中最令人困惑的是,我所见过的没有人用清晰的英语表达了这套规则/对 Java 正在做什么的理解(而是选择了 15 页和图表)。第二个最令人困惑的元素是 Java 以不同于 C++ 的方式使用“引用”一词。如果您想将 Java 在 C++ 方面所做的事情进行类比,指针和我创建的规则是消化 Java 行为的最简单术语。
第 1 点是正确的。
Object o = new Object();
变量 o 存储指向对象在内存中的位置的指针。
第 2 点也是正确的。
Object o = new Object();
o.hashCode();
这是在调用存储在o中的对象的hashCode方法。
第3点,再次纠正。
Dog d = new Dog();
Dog d2 = new Dog();
System.out.println(d == d2);//This will print false
d2 = d;
System.out.println(d == d2);//This will print true
在第一个输出中,d 不等于 d2,因为指向对象的指针不同。在第二个输出中,d 确实等于 d2,因为它们都指向相同的位置。
第 4 点在技术上是正确的。
基元按值传递。
A
将对象传递给函数时,它传递的是指向对象的指针拷贝,而不是传递给对象本身的拷贝。指向对象的指针按值传递给函数。希望这段代码可以帮助解释它。
public void example(int i, Object o) {}
public static void main(String[] args) {
Object o = new Object();
example(3, o);//This is passing the number 3 to the function. It also passes by vlue a pointer to where object o is stored in memory.
}