我知道java是按值而不是按引用返回的,所以它会复制对象并传递新的副本。return 语句也是这种情况吗?是否
return obj;
创建一个新的对象副本或简单地返回当前对象本身。
不,这是一个错误的假设。Java确实通过 value 传递所有内容,但这意味着以下内容:
标量变量包含值,因此您可以很容易地看到它们是按值传递的。
另一方面,对象变量不包含对象。您可以将它们视为包含对象的伪地址。该伪地址被复制(按值),但它仍然指向同一个对象。(对象实际上只使用new
表达式创建。)
以上对于赋值、参数和返回值都是正确的(对于两种类型的变量)。
so it makes a copy of the object and passes the new copy
不!它不是!
按值返回是指obj
返回引用中的值,如果obj
指向某个对象,则从该返回方法中收集返回值的其他引用也将指向与obj
所指向的对象相同的对象。
不,它不会创建另一个要返回的对象。
Java 不会复制对象,它会将对象引用传递给方法,并在您使用时返回return
它复制值的唯一时间是当您使用主要类型时,例如int
,char
或double
它只是返回当前对象本身。
你说的更像是C++
在做这样的事情。当您返回一个对象(非基本类型)时,您将返回一个引用,并且您不会创建新对象或执行复制。
在 java 中,原子类型(char、int、long 等)按值返回。对象总是通过引用返回(没有克隆)。
是
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
}