Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java(初学者):返回一个对象?它是作为常量引用返回的还是什么?_Java_Object_Clone_Pass By Reference_Return - Fatal编程技术网

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++;
}