我不明白为什么system.out.println(names)在不受方法concat函数影响的情况下输出Sam,而system.out.println(names)却输出Sam4作为方法append方法的结果。为什么StringBuilder受到影响而不是String?通常情况下,对对象的引用调用方法会影响调用方,所以我不明白为什么字符串结果保持不变。提前致谢
public static String speak(String name) {
name = name.concat("4");
return name;
}
public static StringBuilder test(StringBuilder names) {
names = names.append("4");
return names;
}
public static void main(String[] args) {
String name = "Sam";
speak(name);
System.out.println(name); //Sam
StringBuilder names = new StringBuilder("Sam");
test(names);
System.out.println(names); //Sam4
}
因为当您调用speak(name);
时,inside speak
name = name.concat("4");
它创建一个新对象,因为string
是不可变的。当你改变原来的字符串时,它会创建一个新的对象,我同意你是在返回它,但你不是在捕捉它。
所以基本上你所做的是:
name(new) = name(original) + '4'; // but you should notice that both the names are different objects.
试试看
String name = "Sam";
name = speak(name);
当然,现在我认为没有必要解释它为什么与StringBuilder
一起工作,除非您不知道StringBuilder
是可变的。
本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被
问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未
问题内容: 据说在Java方法中,参数是通过值传递的,这对于基元和对象都是正确的,而对象的引用是通过值传递的。为了说明,请考虑以下代码: 能给出相同结果的C ++等价物是什么? 在调用该方法后,使d1的值与该方法内的值相同,即调用方看到修改后的值,那么C ++的等效项是什么? 问题答案: C ++对于值和引用的语义与Java不同。首先,每种类型都有可能通过复制,引用或地址传递(但是,可以通过隐藏复
问题内容: 我一直在尝试以下方法: 我得到的是: 因此,这意味着 my_list 是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。 问题答案: 正如AndréLaszlo所说,该库需要对传递给方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,
我一直认为Java使用按引用传递。 然而,我看到一篇博客文章声称Java使用传递值。 我想我不明白他们的区别。 原因是什么?
问题内容: 我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。 执行 谁能向我解释这些问题… 价值传递是什么意思? 答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。 How do you say Java是通过价值传递? 为什么Java是按值传递而不是按引用传递? 上面的程序Tries是否显示了“按值传递”和“引