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

2022-09-02 23:43:48

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

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


答案 1

在 Java 中,始终返回引用(除非返回的值是基元类型,如 、 、 、 ...)。intfloatchar

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


答案 2

所以,要回答你的问题,你必须首先知道Java是如何传递变量的。

变量的值为:

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

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

所以 i 包含 1234,p 包含地址(假设 a4dfi3)。

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

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

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

在这个例子中,我们仍然把我们的人叫“彼得”的地址交给方法。但是这一次,该方法在某个人中创建了一个新的人(因此覆盖了某人中的地址......假设13n37s。但!a4dfi3的人没有改变!打印调用仍输出“Peter”而不是“Walter”。

现在,让我们看看这对基元的行为:

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

因此,i的值(1234)被传递给某个Integer。然后一些Integer被递增到1235。但我仍然是1234。

这是Java中对象和基元之间的巨大区别。

现在回答你的问题:1.正如你可以在这里读到的,是的,Java总是传递对象的参考地址。2.如果你不希望有人弄乱你的对象的值,你必须首先用这些信息创建一个新的对象(例如克隆和克隆()),但这是一个真正的混乱,因为你必须确保,你的对象中所有不是原始的东西都会被重新创建,当你有巨大的对象树结构时,这真是太糟糕了。

我希望我能帮忙,Ferdi265