通过价值或参考。简单的看法

时间:2011-12-15 05:50:56

标签: java

  

可能重复:
  Is Java pass by reference?

在阅读了关于这个主题的讨论后,可以得出结论,当Java传递一个变量时,说A(不包括基本类型),这意味着它传递了对象,变量(A)正在引用。因此,对该对象所做的任何更改都会反映在变量(A)中。所以最后它在一般术语中作为参考传递?

5 个答案:

答案 0 :(得分:1)

请参阅Is Java "pass-by-reference" or "pass-by-value"?

Java总是calls-by-value。在传递对象的情况下,它传递引用的"值"这给了Java call-by-object-sharing的语义(它通过 call-by-value -of-the-reference来实现!)。

我想说:传递对象时不会复制。然后,因为它是方法内部的同一个对象 - 变量只是一个不同的名称"对于它 - 如果你在方法中改变了对象(而不是变量!),你可以在外面改变那个对象 - 无论在哪里,也是如此。 (这是同一个对象,所有: - )

请注意,变量永远不会传递。它们被评估为表达式,并且它们评估的被传递。

某些语言(如C ++)支持call-by-reference。这是不同,而不是按值调用或按对象分享共享,因为这些函数是使用(通常受限制的一组)" lvalues"来调用的。作为参数和重新分配函数中的参数将影响" lvalues"在外面。 "左值"通常是变量,对这种调用约定的支持因语言而异(许多人不支持它!)。

快乐的编码。

答案 1 :(得分:1)

不,这不正确。

JAVA中的所有内容都是通过值传递的 - 没有例外!

然而,理解你传递的不是对象,而是对它的引用至关重要。 此引用按值传递(因此您无法在方法中更改它)。 您确实可以通过此引用更改对象数据,但正如我所说 - 您无法更改引用以引用其他对象(或者就此而言为null)。

答案 2 :(得分:1)

Java使用按值语义将参数传递给方法。也就是说,方法调用的每个指定参数的值的副本将作为其参数传递给方法。

非常清楚地注意到很多人混淆了#34;参考"关于Java对对象的引用和通过引用调用语义传递的术语。事实上,在处理Java对象的引用时,引用值的副本是传递给方法的值 - 它是按值传递的。例如,这就是为什么你不能在被调用方法中改变(原始的,调用者对)对象的引用。

"pass by reference"表示如果将变量传递给方法,则可以修改其值。这可以用于许多语言,如Pascal,Ada和C ++,但not in many other languages like C and Java.

这是一个很好的讨论。 http://www.jguru.com/faq/view.jsp?EID=430996

答案 3 :(得分:0)

Java不通过引用传递。它也不传递对象。它按值传递对象引用。在方法内部,您可以对传递的对象进行更改,但不能在调用代码中更改引用本身。

void foo(Object obj) {
    foo = new Object();
}

Object obj = new Object();
Object obj2 = obj;
foo(obj2);
System.out.println("obj2 passed by " + (obj == obj2 ? "value" : "reference"));

此代码将打印“按值传递”。

答案 4 :(得分:0)

我将在以下方面得出更多结论:

Java按值传递所有参数,原始和非原始参数。在非基本类型的情况下,Java实际传递的是按值的对象实例的指针(或“引用”)。这意味着调用者的引用本身的副本(即指针实际指向的内存位置)无法更改。但同时,被调用者修改的引用对象实例内部的任何状态也将在调用者的对象“副本”中被修改,因为实际上只有调用者和调用者的对象的单个实例。被叫分享。