PS:本人是最近才接触Java的,在这之前一直学习C++。在刚开始接触到Java时,各种书籍和视频都在强调Java是纯面向对象的语言,除去基本数据类型外任何变量都是引用类型。
我遇到的问题如下:
我写了如下代码
public class TestStringAddress{
public static void main(String[] args){
TestStringAddress teststring = new TestStringAddress();
StringBuffer hello = new StringBuffer("Hello");
StringBuffer world = new StringBuffer("World");
teststring.ModifyString( hello, world);
System.out.print(hello + " ");
System.out.println(world);
}
public void ModifyString(StringBuffer hello, StringBuffer world){
hello = new StringBuffer("World");
world = new StringBuffer("Hello");
}
}
然后运行,输出结果如下
我发现字符串根本没有改变。MidifyString的参数不是一个引用吗?为什么没有改变呢?
修改MidifyString函数如下:
public void ModifyString(StringBuffer hello, StringBuffer world){
//hello = new StringBuffer("World");
//world = new StringBuffer("Hello");
hello.append(" Hello");
world.append(" World");
}
打印输出:
这次修改了。
后来才明白原因:这些形参只不过是与实参指向相同的地址,他们不是同一个变量,只是单纯的将实参指向的值拷贝给形参。与C++中所说的引用不同。所以只能通过点操作修改值。
那么能不能不通过点操作进行修改实参呢?这里我能想到的只能是通过返回值修改实参的指向。
不知道别人有没有其他方法?