Java 对象赋值

标签 java object pass-by-reference variable-assignment

我是 Java 的新手,我有一些关于对象分配的问题。例如,

Test t1 = new Test();
Test t2 = t1;
t1.i=1;

假设变量 i 是在 Test 类中定义的,我是否正确地假设 t1 和 t2 指向同一个对象,其中修改 t1.i=1 影响两者t1t2?实际上我测试了一下,似乎我是对的。然而,当我在 String 上尝试同样的事情时,修改只发生在另一侧不受影响的一侧。这背后的原因是什么?

编辑:我尝试使用 String 的案例。

String s1 = "0";
String s2 = s1;          
s1 = "1";
System.out.println(s1);
System.out.println(s2);

我通过在 String 上测试案例意识到我的错误,因为它是不可变的。我认为s1="1" 修改字符串的情况实际上是将“1”的引用返回给s1。尽管如此,我的问题仍然存在。 Test t2 = t1; 是否导致 t2 和 t1 指向同一个对象或每个现在都有自己的对象?这种情况适用于 Java 上的所有对象吗?

最佳答案

你是对的,但是字符串是一个特例;在这种情况下,它们是不可变的并且表现得像原语。

@newacct

我引用 http://docs.oracle.com/javase/tutorial/java/data/strings.html :

Note: The String class is immutable, so that once it is created a String object cannot be changed. The String class has a number of methods, some of which will be discussed below, that appear to modify strings. Since strings are immutable, what these methods really do is create and return a new string that contains the result of the operation.

这就是使字符串成为特例的原因。如果您不知道这一点,您可能会认为引文中讨论的方法不会返回新字符串,这会导致意外结果。

@user1238193

考虑您的以下问题:“Test t2 = t1; 是否导致 t2 和 t1 指向同一个对象,或者现在每个对象都有自己的对象?这种情况是否适用于 Java 上的所有对象?”

t1 和 t2 将指向同一个对象。对于任何 java 对象(包括不可变对象(immutable对象))都是如此

关于Java 对象赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011724/

相关文章:

java - 使用JRuby直接调用Android Java方法

java - 具有自己变量的子类的复制构造函数

javascript - 如何合并包含对象的数组?

PHP:str_replace() 中的 "... variables can be passed by reference"?

c++ - 尝试在 vector 类中创建复制函数

java - 如何使用 Java 创建 Excel 表格?

java - 如何解决我的 Jsp 程序中的错误?

c++ - 试图在 C++ 中声明一个成员对象

c++ - 重新检查时指针属性发生变化

Java 按值传递和按引用传递