1

我知道java是按值而不是按引用返回的,所以它会复制对象并传递新的副本。return 语句也是这种情况吗?是否

return obj;

创建一个新的对象副本或简单地返回当前对象本身。

4

7 回答 7

7

不,这是一个错误的假设。Java确实通过 value 传递所有内容,但这意味着以下内容:

  • 标量变量包含值,因此您可以很容易地看到它们是按值传递的。

  • 另一方面,对象变量不包含对象。您可以将它们视为包含对象的伪地址。该伪地址被复制(按值),但它仍然指向同一个对象。(对象实际上只使用new表达式创建。)

以上对于赋值、参数和返回值都是正确的(对于两种类型的变量)。

于 2013-01-24T11:45:52.490 回答
2

so it makes a copy of the object and passes the new copy

不!它不是!

按值返回是指obj返回引用中的值,如果obj指向某个对象,则从该返回方法中收集返回值的其他引用也将指向与obj所指向的对象相同的对象。

不,它不会创建另一个要返回的对象。

于 2013-01-24T11:43:51.203 回答
1

Java 不会复制对象,它会将对象引用传递给方法,并在您使用时返回return

它复制值的唯一时间是当您使用主要类型时,例如intchardouble

于 2013-01-24T11:43:52.923 回答
1

它只是返回当前对象本身。

于 2013-01-24T11:44:41.333 回答
1

你说的更像是C++在做这样的事情。当您返回一个对象(非基本类型)时,您将返回一个引用,并且您不会创建新对象或执行复制。

于 2013-01-24T11:44:52.387 回答
1

在 java 中,原子类型(char、int、long 等)按值返回。对象总是通过引用返回(没有克隆)。

于 2013-01-24T11:44:53.867 回答
1

return obj;创建一个新对象复制还是返回当前对象本身?

-->obj是指向堆上实际对象的对象引用。将在您分配返回的方法中创建新的对象引用(由您)obj

Object method() {
  //....
  return obj;
}

void methodA() {
  Object objA = method(); // obj and objA are different because of their scopes but values are same(assigned to objA). That's why both points to the same Object on heap
}
于 2013-01-24T11:45:31.673 回答