我有一个有void方法的类。
我的问题是,这些方法是如何执行的。因为我的stringBuilderAppend()是一个void方法,但是当我调用这个方法时,它会返回在该方法中附加的值,并且我正在使用其他两个方法(即stringAppend()和addNumbers())进行相同的检查。不归还任何东西。
public class VoidMethodChecker {
public static void main(String... a){
StringBuilder stringBuilder = new StringBuilder("first StringBuilder ");
stringBuilderAppend(stringBuilder);
String string = "first String ";
stringAppend(string);
int number = 0;
addNumber(number);
/* stringBuilderAppend method prints "first StringBuilder second StringBuilder"
* why does stringBuilder() returning the appended value. (my stringBuilder() is void method)
* as other two method does not appending*/
System.out.println(stringBuilder); // it prints "first StringBuilder second StringBuilder"
System.out.println(string); // it prints "first String"
System.out.println(number); // it prints "0"
}
private static void stringBuilderAppend(StringBuilder stringBuilder) {
stringBuilder.append("second StringBuilder");
}
private static void addNumber(int number){
number = 120;
}
private static void stringAppend(String string){
string += "second String";
}
}
由于
答案 0 :(得分:3)
stringBuilderAppend
:该方法没有返回任何内容。您正在传递一个对象并在方法体内修改其状态。当您在调用方法中保留对同一对象的引用时,您会看到对该对象所做的更改。这是面向对象的基本概念,您需要了解它。
addNumber
:您正在传递一个分配给参数number
的原始整数。该参数只是一个仅在方法体中可见的变量。如果为该变量分配一个新值,那么调用者就不会看到该值。如果您在修改变量(stringBuilderAppend
)之前将新的StringBuilder
分配给stringBuilder = new StringBuilder()
,则stringAppend
也会发生同样的情况。
addNumber
:基本上与string += "second String"
相同。 string = string + "second String"
与{{1}}相同,因此您要为变量分配新值。
答案 1 :(得分:2)
您正在将引用值传递给您的函数private static void stringBuilderAppend(StringBuilder stringBuilder)
。
这意味着函数可以修改stringBuilder
引用的对象。这就是你正在做的事情。
您在中在您的函数中执行的操作是在stringBuilder
中设置main
以引用其他StringBuilder
实例。
答案 2 :(得分:2)
让我们来看看你的例子:
stringBuilderAppend
:
您的main
- 方法创建一个StringBuilder
- 对象,并将引用(确切地说:原始引用的副本,因为引用按值传递)传递给该对象stringBuilderAppend
。在那里你调用该对象的append()
方法,从而修改原始对象。
addNumber
:由于number是int
而int
是基本类型,因此您不传递引用,而是传递原始int的副本。在方法期间修改,但原始变量保持不变
stringAppend
:这里的事情开始变得有趣了。您正在将引用的副本传递给原始String
- 对象。但+=
并未修改原始对象(String
无法修改,它们是不可变的),而是将连接的String
创建为新对象。然后,赋值将替换引用的副本。原始参考和原始对象都保持不变。
答案 3 :(得分:0)
Java字符串是不可变的,即您无法更改字符串的值。将新字符串文字添加到现有值时,Java会再创建一个新字符串。 StringBuilder / StringBuffer可变的地方。
因此,在String的情况下,它在内存中创建一个包含值“first stringsecond string”的新文字,其中将范围限制为该特定方法。在StringBulder的情况下,它将字符串附加到现有字符串。
然而,当您将int作为参数传递时,它将按值传递。
谢谢, JK