java(初学者):返回一个对象?是作为常量引用返回还是什么?

问题描述 投票:10回答:5

我有一个返回用户定义对象的函数。首先,我想知道该对象是否通过引用返回,如果它是私有的?

另外,我如何将其作为常量(最终)引用返回,因为我不希望有人弄乱它?在返回一个对象和返回object.copy()之间我很困惑;或object.clone();

java object clone pass-by-reference return
5个回答
13
投票

在Java中,您总是返回一个引用(除非返回的值是基本类型,如intfloatchar,...)。

因此,如果您不希望修改返回的对象,则必须返回它的完整副本(如果您的类定义了它,您可以使用Clonable接口和clone方法)。


10
投票

因此,要回答您的问题,您必须首先了解Java如何通过变量。

变量有一个值:

int i = 1234;
Person p = new Person("Peter");

现在,变量i包含1234,而变量p包含创建的Person的内存地址。

所以我包含1234而p包含地址(让我们说a4dfi3)。

anyMethodYouLike(p);
System.out.println(p.getName());
public void anyMethodYouLike(Person somePerson) {
   somePerson.rename("Homer");
}

所以在这个例子中,我们给方法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");
}

在这个例子中,我们仍然将我们的Person的地址称为“Peter”。但是这一次,方法在somePerson中创建了一个新的Person(因此覆盖somePerson中的地址...让我们说13n37s。但是!a4dfi3的人没有改变!打印调用仍然输出“Peter”而不是“Walter” 。

现在,让我们看一下这与原语的行为:

someMethod(i);
System.out.println(i);
public void someMethod(int someInt) {
   someInt++;
}

因此,i(1234)的值被传递给someInteger。然后someInteger增加到1235.但我仍然是1234。

这是Java中对象和原语之间的巨大差异。

现在回答您的问题:1。正如您可以在这里阅读的那样,是的Java总是通过对象的参考地址。 2.如果你不想让某人弄乱你的对象的值,你必须先用这些信息创建一个新的对象(例如使用Cloneable和clone()),但这是一个真正的混乱,因为你必须确保,你的对象中非原始的一切都被重新创建,当你拥有巨大的对象树结构时,这是非常糟糕的。

我希望我可以帮忙,Ferdi265


2
投票

你应该真正意识到的是,“传递”或“回归”没有什么特别之处。每当你“传递”或“返回”某些东西时,它只是传递了东西的价值。期。适用于任何类型。无论何时“传递”或“返回”某些内容,它都与将其分配给变量完全相同。

但是,你传递或返回的东西的价值是多少?这就是你的困惑似乎在哪里。你的问题是关于“归还一个物体”;但是,这样的事情在Java中没有意义。对象不是Java中的值。不可能有一个值为对象的变量。

Java中唯一的类型是基本类型和引用类型。因此,唯一的值是基元和引用。 (引用是指向对象的指针。)在Java中,我们只通过引用(指向对象的指针)来操作对象。我们不能将对象存储在变量中;但是我们可以在变量中存储引用(指向对象的指针)。所以当你谈论传递或返回对象时,你几乎肯定会谈论传递或返回引用。并且,如前所述,传递或返回引用没有什么特别之处 - 传递或返回引用(指针)的值。


1
投票

它返回对象的引用。

假设你有一个类似的方法调用。

Object obj = makeObject();

它创建一个Object并返回(这是在makeObject方法中创建的对象的引用)。


0
投票

1)是的,它返回对象的引用。

2)如果方法是私有的,那么它只能从类本身内部调用。

3)制作一个对象final不会阻止其他人调用它上面的方法。有一些方法可以通过使用包和方法可见性使对象不可变。 (查看公共,受保护和私人工作的方式)

4)没有Object.copy()

5)Object.clone()是一个凌乱的野兽。

© www.soinside.com 2019 - 2024. All rights reserved.