还没理解引用和对象的关系吧。
引用可以用来指向一个对象;
然后还可以修改引用的指向,让它放弃指向原来的对象,转而指向另一个对象。
引用跟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指向的那个对象,而形参和外面的实参指向的是同一个对象。
}