我最近阅读了这篇文章:Is Java "pass-by-reference" or "pass-by-value"?
第一个答案太过简洁和具体,无法给我一个坚定的理解,其他人创造了15篇论文,解释了什么应该是一个简单的话题。以下规则是否正确(如果是真的则非常简单):
1。)与非基元类型相关联的命名事物(Java talk中的“对象引用”)是C ++中的指针。
2。)。在Java指针上与使用 - >相同在C ++指针上。
3。)=在Java指针上与在C ++指针上使用=相同。
4.)所有函数都按值传递(因此按值传递Java指针)。
(这忽略了内存管理上的差异,比如在Java指针上的=很好而在C ++指针上= =意味着你可能需要担心内存管理)
这个谜题中最令人困惑的因素是,我所见过的任何人都没有传达这套规则/理解Java正在用清晰的英语做什么(选择15页和图表)。第二个最令人困惑的元素是Java使用“引用”一词的方式与C ++不同。如果你想要用C ++来表达Java之间的类比,那么指针和我创建的规则是消化Java行为的最简单的术语。
答案 0 :(得分:2)
第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点在技术上是正确的。
原语按值传递。 一个 将对象传递给函数时,它将指针的副本传递给对象,而不是复制到对象本身。指向对象的指针正在通过值传递给函数。希望这段代码可以帮助解释它。
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.
}