呼叫值和呼叫共享之间有什么区别?
我正在阅读此answer,它说JavaScript是通过共享呼叫? 如果确实如此,那么为什么Java是呼叫值而不是通过共享调用。
答案 0 :(得分:1)
正如维基百科所述
“通过共享呼叫”一词并不常用;不同来源的术语不一致“
因此,虽然Java可以被认为是通过共享进行调用,但并不是这样称呼,因为该术语没有标准含义。
相反,Java指的是“按值调用”,因为唯一的变量类型是基元和引用,它们总是按值传递。
答案 1 :(得分:1)
您必须考虑的关键区别是,构成表达式的价值。在
int i = 2+3;
i
的值是数字5本身。在
Date d = new Date();
d
的值是Date对象的引用,而不是对象本身。
一旦你清除了它,Java就是一种严格的按值传递的语言。这意味着表达式的值被复制到被调用方法私有的新位置。它可以修改该位置而不会影响调用方法。
然而,在
Date d = new Date();
modify(d);
d
引用的对象通过共享"传递":被调用的方法获取对象的引用的副本,因此它可以以调用的方式修改对象方法会观察。被调用的方法不能修改的是调用者对该对象的引用,因此它不能使调用者在方法返回时看到另一个对象。因此
Date d = new Date();
Date d2 = d;
modify(d);
System.out.println(d2 == d);
保证true
modify
对d
引用的副本或其引用的对象进行打印==
。 (请记住,{{1}}仅比较值)。