java(初学者):返回一个对象?是作为常量引用返回还是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java(初学者):返回一个对象?是作为常量引用返回还是什么?相关的知识,希望对你有一定的参考价值。
我有一个返回用户定义对象的函数。首先,我想知道该对象是否通过引用返回,如果它是私有的?
另外,我如何将其作为常量(最终)引用返回,因为我不希望有人弄乱它?在返回一个对象和返回object.copy()之间我很困惑;或object.clone();
在Java中,您总是返回一个引用(除非返回的值是基本类型,如int
,float
,char
,...)。
因此,如果您不希望修改返回的对象,则必须返回它的完整副本(如果您的类定义了它,您可以使用Clonable
接口和clone
方法)。
因此,要回答您的问题,您必须首先了解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
你应该真正意识到的是,“传递”或“回归”没有什么特别之处。每当你“传递”或“返回”某些东西时,它只是传递了东西的价值。期。适用于任何类型。无论何时“传递”或“返回”某些内容,它都与将其分配给变量完全相同。
但是,你传递或返回的东西的价值是多少?这就是你的困惑似乎在哪里。你的问题是关于“归还一个物体”;但是,这样的事情在Java中没有意义。对象不是Java中的值。不可能有一个值为对象的变量。
Java中唯一的类型是基本类型和引用类型。因此,唯一的值是基元和引用。 (引用是指向对象的指针。)在Java中,我们只通过引用(指向对象的指针)来操作对象。我们不能将对象存储在变量中;但是我们可以在变量中存储引用(指向对象的指针)。所以当你谈论传递或返回对象时,你几乎肯定会谈论传递或返回引用。并且,如前所述,传递或返回引用没有什么特别之处 - 传递或返回引用(指针)的值。
它返回对象的引用。
假设你有一个类似的方法调用。
Object obj = makeObject();
它创建一个Object并返回(这是在makeObject方法中创建的对象的引用)。
1)是的,它返回对象的引用。
2)如果方法是私有的,那么它只能从类本身内部调用。
3)制作一个对象final
不会阻止其他人调用它上面的方法。有一些方法可以通过使用包和方法可见性使对象不可变。 (查看公共,受保护和私人工作的方式)
4)没有Object.copy()
5)Object.clone()
是一个凌乱的野兽。
以上是关于java(初学者):返回一个对象?是作为常量引用返回还是什么?的主要内容,如果未能解决你的问题,请参考以下文章