gpt4 book ai didi

Java String 变量设置 - 引用还是值?

转载 作者:太空狗 更新时间:2023-10-29 22:36:06 24 4
gpt4 key购买 nike

以下 Java 代码段来自 AP 计算机科学实践考试。

String s1 = "ab";
String s2 = s1;
s1 = s1 + "c";
System.out.println(s1 + " " + s2);

此代码的输出是 BlueJ 上的“abc ab”。但是,可能的答案选择之一是“abc abc”。答案可能取决于 Java 是像原始类型(按值)还是像对象(按引用)那样设置 String 引用。

为了进一步说明这一点,让我们看一个原始类型的例子:

int s1 = 1;
int s2 = s1; // copies value, not reference
s1 = 42;

System.out.println(s1 + " " + s2); // prints "1 42"

但是,假设我们有持有余额的 BankAccount 对象

BankAccount b1 = new BankAccount(500); // 500 is initial balance parameter
BankAccount b2 = b1; // reference to the same object
b1.setBalance(0);
System.out.println(b1.getBalance() + " " + s2.getBalance()); // prints "0 0"

我不确定字符串是哪种情况。它们在技术上是对象,但我的编译器在为彼此设置变量时似乎将它们视为原始类型。

如果 Java 像原始类型一样传递 String 变量,答案是“abc ab”。但是,如果 Java 将字符串变量视为对任何其他对象的引用,则答案将是“abc abc”

你认为哪个是正确答案?

最佳答案

java 字符串是不可变的,因此您的重新分配实际上会导致您的变量指向一个新的字符串实例,而不是更改字符串的值。

String s1 = "ab";
String s2 = s1;
s1 = s1 + "c";
System.out.println(s1 + " " + s2);

在第 2 行,s1 == s2 AND s1.equals(s2)。在第 3 行连接之后,s1 现在引用具有不可变值“abc”的不同实例,因此 s1==s2 和 s1.equals(s2) 都不是。

关于Java String 变量设置 - 引用还是值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com