如果一个函数是使用所谓的Call-by-Reference
,然后到变量所做的函数中的任何改变会立即影响到调用者。 而对于Call-by-Sharing
,它是在函数结束的影响。
问题1:请问Java使用Call-by-Sharing
,而不是Call-by-Reference
?
问题2:我认为, Call-by-Sharing
不同于Call-by-Reference
仅在多线程。 它只是制造,而它在其他线程被用于减少过度值写入并行; 提供一致性。 我对吗?
我建议你不要使用术语“通过共享呼叫”。 由于这个维基百科的文章中指出:
“然而,术语‘分享’的呼叫不常用;该术语在不同的来源不一致。例如,在Java社区中,他们说,Java是通过按值,而在Ruby社区,他们说,Ruby是通过按参考文献[编辑],即使这两种语言表现出相同的语义。调用式共享意味着,在语言值基于对象,而不是原始的类型。”
和
“虽然这个术语在Python社区广泛使用,在其他语言如Java和Visual Basic相同的语义经常被描述为呼叫按值,其中值隐含为对象的引用。”
底线是Java“通过共享呼叫”用......但他们不称呼它,你可能不应该或者,如果你想Java的人了解你。
我认为,呼叫通过共享来自呼叫通过引用不同,只有当多线程。 它只是制造,而它在其他线程被用于减少过度值写入并行; 提供一致性。 我对吗?
不,你是不正确的。
实际上意味着在其中的值是一个对象引用的情况下“按值呼叫”,“通过共享呼叫”。 真正的“通过引用调用”意味着你(实际上)传递变量的地址,被调用的方法可以更新变量。
这是一个众所周知的事实,Java是通过按值(使用更共同的语言),但很多混乱的一个事实,即通过一个对象引用一个方法允许该方法修改对象中的呼叫者的范围产生(即,它们“共享”的对象)。 所以,有些人错误地认为Java是通过按引用非原语。 按照我的理解,说什么是“呼叫由共享”只是把它清楚地表明我们传递的价值是一个对象的引用,而不是对象本身。
相比之下,如R语言传递的价值,但通过非原语像载体深拷贝(技术上写入时复制为我收集),使得该方法的范围作出更改对象不修改向量调用者的范围。
要回答你的两个问题而言,是的,Java正在“呼叫由共享”为我来向你链接的维基百科文章的理解。 不过,我不同意,呼叫通过共享和调用 - 参考你所描述的方式不同。 一个区别是,你可以不写交换两个变量与呼叫通过共享的方法。
在语言,其中的对象名是在存储器中的对象的引用,与呼叫由共享当一个经过一个对象(一个对象的引用)的参考被复制和实际和形式参数都将是指相同的对象。 如何从这个不同的呼叫按值或调用按引用...
因此,对于谁使用期限(即CLU程序员)的极少数人呼叫通过共享是个call-by-值不同,因为,虽然我们做实际的参数拷贝到形式参数,两人都引用; 如果我们修改到正规的参数所引用的对象,程序就能看到子程序返回后,通过实际参数这些变化。
另外请注意,一个呼叫的对象的值可以被改变,这使得它类似于调用-参考,但它从呼叫按引用不同,因为到对象的参考被复制期间,以使对象的身份不能被改变。 因此,原来的引用变量仍指向同一个对象即使使用呼叫通过共享一个“交换”程序。
文章来源: Does call-by-sharing and call-by-reference differ only while multithreading?