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

Posted

技术标签:

【中文标题】java(初学者):返回一个对象?它是作为常量引用返回还是啥?【英文标题】:java (beginner) : returning an object ? is it returned as a constant reference or what?java(初学者):返回一个对象?它是作为常量引用返回还是什么? 【发布时间】:2011-05-11 11:02:34 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

它返回对象的引用。

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

Object obj = makeObject();

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

...或者对象被设计为不可变的。 @Michael Borgwardt:很重要。我认为将其添加到答案中会使提出问题的人感到困惑... 是引用传递的数组吗?据我所知,它是一种原始类型,但它是可变的。【参考方案3】:

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

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

3) 创建一个对象final 不会阻止其他人调用它的方法。有一些方法可以通过使用包和方法可见性来使对象不可变。 (查看 public、protected 和 private 的工作方式)

4) 没有Object.copy()

5) Object.clone() 是一头乱七八糟的野兽。

【讨论】:

【参考方案4】:

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

一个变量有一个值:

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

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

所以 i 包含 1234,p 包含地址(比如说 a4dfi3)。

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

所以在这个例子中,我们给方法 anyMethodYouLike 变量 p...等等!我们给方法变量的值(a4dfi3)。然后,该方法对该变量调用 rename(它仍然具有与 p 相同的地址,因此它修改了 p 指向的同一 Person)。 因此,在方法之后,p 指向的人的名称被打印出来,结果是“荷马”。

someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson) 
   somePerson = new Person("Walter");

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

现在,让我们看看它在原语中的表现:

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

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

这是 Java 中对象和原语的最大区别。

现在回答您的问题: 1. 正如您在此处所读到的,是的,Java 总是传递对象的引用地址。 2. 如果你不想让别人弄乱你的对象的值,你必须先用这些信息创建一个新的对象(例如使用 Cloneable 和 clone()),但这真的是一团糟,因为你必须确保,你的对象中所有不是原始的东西都会被重新创建,当你有巨大的对象树结构时,这真是太糟糕了。

希望能帮到你 费迪265

【讨论】:

【参考方案5】:

您真正应该意识到的是,“通过”或“返回”并没有什么特别之处。每当您“传递”或“返回”某物时,它只是传递了该事物的价值。时期。对于任何类型。每当你“传递”或“返回”某个东西时,它与简单地将它分配给一个变量完全相同。

然而,什么是你传递或返回的东西的价值?这就是你的困惑所在。您的问题询问“归还对象”;但是,这样的事情在 Java 中没有意义。对象不是 Java 中的值。不可能有一个值为对象的变量。

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

【讨论】:

以上是关于java(初学者):返回一个对象?它是作为常量引用返回还是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 返回指针或常量引用

Java 接口

Java基础2

Java虚拟机知识点引用

Java GC 垃圾回收之 判断那些可回收,怎么回收

C++,fstream 对象作为引用传递给函数,常量?