对Java传递方法感到困惑(按值或引用)

时间:2014-10-23 06:31:56

标签: java pass-by-reference pass-by-value

人, 拜托,你能为我澄清一些事情吗?

据我所知(如果我错了,请纠正我),当我将变量传递给方法或类别时,我是按照价值来传递的,不是吗?

如果它是真的,为什么Java有方法.clone()?

为什么我会问这个问题,因为我很困惑......这是代码: 如果我使用以下代码传递变量然后在对话框中修改它们,原始值(外部)也会更改。

DialogChoosePayment mDialogChoosePayment = new DialogChoosePayment(mContext,  (ArrayList<Payment>) defaultValues.getPayment(), (ArrayList<Payment>) selectedValues);
                mDialogChoosePayment.show();

但是,如果我使用下面的那个,那么变量值(来自外部的原始变量)不会改变。

DialogChoosePayment mDialogChoosePayment = new DialogChoosePayment(mContext,  (ArrayList<Payment>) defaultValues.getPayment().clone(), (ArrayList<Payment>) selectedValues.clone());
                    mDialogChoosePayment.show();

请解释给新手=)

5 个答案:

答案 0 :(得分:1)

Java按值传递参数。关于这个主题有很多参考。最流行的例子是你不能简单地实现接受2个参数并交换它们的值的方法swap()

这种混淆可能是因为误解了这样的界线:

Object x = new Object();

确实会创建对象,但会将对它的引用分配给变量x,因此x是一个引用。但是,如果您将x传递给方法,则按值传递引用(如果需要,则传递引用值)。

这可以为您提供方法clone()。当我们想要创建与第一个类似的其他对象时,我们需要它。相似性意味着它包含相同的数据并依赖于克隆实现(深层次或非深层次)。但这绝对是另一个讨论。

答案 1 :(得分:1)

来源:http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

传递原始数据类型参数

将原始参数(例如int或double)传递到方法的价值。这意味着对参数值的任何更改都仅存在于方法的范围内。当方法返回时,参数消失,对它们的任何更改都将丢失。

传递参考数据类型参数

参考数据类型参数(如对象)也会传递给方法按价值。这意味着当方法返回时,传入的引用仍然引用与以前相同的对象。但是,如果对象的字段值具有适当的访问级别,则可以在方法中更改它们的值。

答案 2 :(得分:0)

Java具有按值传递且仅按值传递。同时Java有指针(官方称为引用);因此,当您将对象传递给方法时,您基本上会通过值传递引用该对象的变量。

如果修改对象,则会在被调用的站点上修改对象。如果修改了对被调用方法中对象的引用,则在被调用的站点上看不到这一点。

在第二种情况下,您使用.clone()创建新对象并传递它们。由于仅在被调用的站点中没有其他引用,因此只能在那里看到更改。

答案 3 :(得分:0)

当您传递(ArrayList<Payment>) defaultValues.getPayment()时,您实际上正在传递对数组列表的引用。使用该引用的任何修改都将反映到您的列表中。

当您传递(ArrayList<Payment>) defaultValues.getPayment().clone()时,您正在创建数组列表的克隆并将引用传递给克隆列表。任何更改都将仅反映到克隆的数组列表,而不是原始数组列表。

答案 4 :(得分:0)

在第一种情况下,您拥有对象的引用副本。当然你可以改变那些对象的状态。
在第二种情况下,您也有参考文献的副本。但是这些引用指向了新的克隆对象。