人, 拜托,你能为我澄清一些事情吗?
据我所知(如果我错了,请纠正我),当我将变量传递给方法或类别时,我是按照价值来传递的,不是吗?
如果它是真的,为什么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();
请解释给新手=)
答案 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
答案 2 :(得分:0)
Java具有按值传递且仅按值传递。同时Java有指针(官方称为引用);因此,当您将对象传递给方法时,您基本上会通过值传递引用该对象的变量。
如果修改对象,则会在被调用的站点上修改对象。如果修改了对被调用方法中对象的引用,则在被调用的站点上看不到这一点。
在第二种情况下,您使用.clone()
创建新对象并传递它们。由于仅在被调用的站点中没有其他引用,因此只能在那里看到更改。
答案 3 :(得分:0)
当您传递(ArrayList<Payment>) defaultValues.getPayment()
时,您实际上正在传递对数组列表的引用。使用该引用的任何修改都将反映到您的列表中。
当您传递(ArrayList<Payment>) defaultValues.getPayment().clone()
时,您正在创建数组列表的克隆并将引用传递给克隆列表。任何更改都将仅反映到克隆的数组列表,而不是原始数组列表。
答案 4 :(得分:0)
在第一种情况下,您拥有对象的引用副本。当然你可以改变那些对象的状态。
在第二种情况下,您也有参考文献的副本。但是这些引用指向了新的克隆对象。