String和StringBuffer

2024-12-17 10:55:49
推荐回答(1个)
回答1:

还没理解引用和对象的关系吧。

引用可以用来指向一个对象;

然后还可以修改引用的指向,让它放弃指向原来的对象,转而指向另一个对象。

引用跟int、double等等类似也是一种量(常量变量)类型,量作为参数传递的时候都是传值。

java和C#这种高级语言经常说什么“引用传参”其实是不准确的,应该是:引用本身是传值,它指向的对象是传的引用。

一个引用指向一个对象,将该引用传递给一个函数的形参,那么实际上,该引用本身是传的拷贝,即形参是实参的一个拷贝,并和原实参引用一样指向同一个对象而已。你在函数内改变形参的指向,并不会改变到函数外面原实参引用的指向。

String str = "Hello"; //str是引用,指向"Hello"这个字符串常量对象
str += " World"; // +操作符会新建一个字符串对象,存放"Hello World"常量对象,并让str指向它,
                //此时str不再指向原来的"Hello"对象。
String str = "Hello"; //str是引用,指向"Hello"这个字符串对象

Change(str);  //函数调用,此处str是实参,传值给函数形参。

system.out.println(str); //str指向没改变,还是"Hello"。

public static void Change(String str)  //此处的str是形参,是实参的拷贝即值传递,形参和实参的引用值一样,即指向同一个对象
{
    str += " World";   //形参指向了新对象"Hello World",不影响外面的实参的指向。
}
StringBuffer str = new StringBuffer("Hello");
//下面解释上面这句
//new新建了一个StringBuffer对象,对象内部有一块内存缓冲区,它存储的数据可以修改;
//还有一个常量字符串对象"Hello",并用来拷贝到StringBuffer对象的内部缓冲区,就是修改;
//str是引用变量,指向那个new出来的StringBuffer对象

Change(str);  //函数调用,此处str是实参,传值给函数形参。

system.out.println(str); //str指向没改变,但它指向的对象被改变了。

public static void Change(StringBuffer str)  //此处的str是形参,是实参的拷贝即值传递,形参和实参的引用值一样,即指向同一个对象
{
    str.append(" World");   //这里append修改的是形参str指向的那个对象,而形参和外面的实参指向的是同一个对象。
}