Ism*_*ush 13 java clone return object pass-by-reference
我有一个返回用户定义对象的函数.首先,我想知道该对象是否通过引用返回,如果它是私有的?
另外,我如何将其作为常量(最终)引用返回,因为我不希望有人弄乱它?在返回一个对象和返回object.copy()之间我很困惑; 或object.clone();
Pab*_*ruz 16
在Java中,你总是返回一个参考(除非返回的值是一个基本类型如int,float,char,...).
因此,如果您不希望修改返回的对象,则必须返回它的完整副本(如果您的类定义了Clonable接口和clone方法,则可以使用它).
Fer*_*265 11
因此,要回答您的问题,您必须首先了解Java如何通过变量.
变量有一个值:
int i = 1234;
Person p = new Person("Peter");
Run Code Online (Sandbox Code Playgroud)
现在,变量i包含1234,而变量p包含创建的Person的内存地址.
所以我包含1234而p包含地址(让我们说a4dfi3).
anyMethodYouLike(p);
System.out.println(p.getName());
public void anyMethodYouLike(Person somePerson) {
somePerson.rename("Homer");
}
Run Code Online (Sandbox Code Playgroud)
所以在这个例子中,我们给方法anyMethodYouLike变量p ...等等!我们给Method赋值变量(a4dfi3).然后,Method调用此变量上的重命名(它仍具有与p相同的地址,因此它会修改p指向的同一个Person).因此,在方法之后,人物的名称p指向,被打印,这导致"荷马".
someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson) {
somePerson = new Person("Walter");
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们仍然将我们的Person的地址称为"Peter".但是这一次,方法在somePerson中创建了一个新的Person(因此覆盖了somePerson中的地址......让我们说13n37s.但是!a4dfi3的人没有改变!打印调用仍然输出"Peter"而不是"Walter" .
现在,让我们看看这与原语的行为:
someMethod(i);
System.out.println(i);
public void someMethod(int someInt) {
someInt++;
}
Run Code Online (Sandbox Code Playgroud)
因此,i(1234)的值被传递给someInteger.然后someInteger增加到1235.但我仍然是1234.
这是Java中对象和原语之间的巨大差异.
现在回答您的问题:1.正如您可以在这里阅读的那样,是的Java总是通过对象的参考地址.2.如果你不想让某人弄乱你的对象的值,你必须先用这些信息创建一个新的对象(例如使用Cloneable和clone()),但这是一个真正的混乱,因为你必须确保,你的对象中非原始的一切都被重新创建,当你拥有巨大的对象树结构时,这是非常糟糕的.
我希望我可以帮忙,Ferdi265
| 归档时间: |
|
| 查看次数: |
50276 次 |
| 最近记录: |