呼叫值和呼叫共享之间的差异

时间:2015-02-26 14:40:59

标签: java javascript

呼叫值和呼叫共享之间有什么区别?

我正在阅读此answer,它说JavaScript是通过共享呼叫? 如果确实如此,那么为什么Java是呼叫值而不是通过共享调用。

2 个答案:

答案 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 modifyd引用的副本或其引用的对象进行打印==。 (请记住,{{1}}仅比较)。