java(初学者):返回一个对象?它是作为常量引用返回的还是什么?
我有一个返回用户定义对象的函数。首先我想知道这个对象是否通过引用返回,如果它是私有的呢java(初学者):返回一个对象?它是作为常量引用返回的还是什么?,java,object,clone,pass-by-reference,return,Java,Object,Clone,Pass By Reference,Return,我有一个返回用户定义对象的函数。首先我想知道这个对象是否通过引用返回,如果它是私有的呢 另外,我如何将其作为常量(最终)引用返回,因为我不希望有人弄乱它?我对返回对象和返回object.copy()很困惑;或object.clone() 它返回对象的引用 假设您有一个方法调用,如 Object obj = makeObject(); 它创建一个对象并返回(它是在makeObject方法中创建的对象的引用) 在Java中,总是返回一个引用(除非返回的值是基本类型,例如int,float,char
另外,我如何将其作为常量(最终)引用返回,因为我不希望有人弄乱它?我对返回对象和返回object.copy()很困惑;或object.clone() 它返回对象的引用 假设您有一个方法调用,如
Object obj = makeObject();
它创建一个对象并返回(它是在makeObject方法中创建的对象的引用) 在Java中,总是返回一个引用(除非返回的值是基本类型,例如
int
,float
,char
,…)
因此,如果不希望修改返回的对象,则必须返回该对象的完整副本(如果类定义了该对象,则可以使用Clonable
接口和clone
方法)。1)是的,它返回对该对象的引用
2) 如果该方法是私有的,那么只能从类本身内部调用它
3) 将对象设置为final不会阻止其他人对其调用方法。通过使用包和方法可见性,可以使对象不可变。(查看公共、受保护和私人工作的方式)
4) 没有对象。copy()
5)
Object.clone()
是一头乱七八糟的野兽。因此,要回答您的问题,您首先必须了解Java是如何传递变量的
变量有一个值:
int i = 1234;
Person p = new Person("Peter");
现在,变量i正好包含1234,而变量p包含被创建人的内存地址
所以i包含1234,p包含地址(比如a4dfi3)
所以在这个例子中,我们给出了方法anyMethodYouLike变量p。。。等待我们给出了该方法的变量值(a4dfi3)。然后,该方法对该变量调用rename(该变量仍然具有与p相同的地址,因此它修改p指向的同一个人)。
因此,在这个方法之后,p指向的人的名字被打印出来,结果是“荷马”
在本例中,我们仍然将名为“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。但i仍然是1234
这就是Java中对象和原语之间的巨大区别
现在回答你的问题:
1.正如您在这里看到的,是的,Java总是传递对象的引用地址。
2.如果您不希望有人弄乱您对象的值,您必须首先使用该信息创建一个新对象(例如,使用Cloneable和clone(),但这是一个真正的混乱,因为你必须确保,你的对象中所有不是原语的东西都被重新创建,当你有巨大的对象树结构时,这是非常糟糕的
我希望我能帮上忙,
Ferdi265您应该真正意识到的是,“传递”或“返回”并没有什么特别之处。每当您“传递”或“返回”某个对象时,它只传递该对象的值。句点。对于任何类型。每当您“传递”或“返回”某个对象时,它与简单地将其赋给变量完全相同 然而,您传递或返回的对象的值是什么?这就是您的困惑所在。您的问题是关于“返回对象”;然而,这样的事情在Java中没有意义。对象在Java中不是值。不可能有一个值为对象的变量
Java中唯一的类型是基元类型和引用类型。因此,唯一的值是基元和引用。(引用是指向对象的指针。)在Java中,我们只通过引用(指向对象的指针)操作对象。我们不能将对象存储在变量中;但我们可以存储引用(指向对象的指针)在变量中。因此,当您谈论传递或返回对象时,几乎可以肯定的是,您谈论的是传递或返回引用。而且,正如前面所说,传递或返回引用没有什么特别之处——引用的值(指针)是传递的还是返回的。…或者对象被设计成不可变的。@Michael Borgwardt:很好。我想把它添加到答案中会让问这个问题的人感到困惑……数组是通过引用传递的吗?据我所知,它是一种基本类型,但它是可变的。
someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson) {
somePerson = new Person("Walter");
}
someMethod(i);
System.out.println(i);
public void someMethod(int someInt) {
someInt++;
}