JAVA引用、非引用[菜鸟求解]
public static void main(String[] args) {
testMethod();
}
public static void testMethod() {
String i = new String("a");
String k = new String("b");
StringBuffer a = new StringBuffer("AAA");
StringBuffer b = new StringBuffer("BBB");
setMethod(a, b);
setMethod(i, k);
System.out.println(a);
System.out.println(b);
System.out.println(i);
System.out.println(k);
}
public static void setMethod(StringBuffer a, StringBuffer b) {
a.append("BBBCCC");
b.append("AAADDD");
}
public static void setMethod(String a, String b) {
a = "10";
b = "20";
}
输出结果:
AAABBBCCC
BBBAAADDD
a
b
stringbuffer是进行引用传递,string是值传递?这个解释对吗?
不是说只要new一个对象,就能得到一个引用,为什么我在用string给值后,应该是更新引用区域的值,为什么没有被更新掉!!!
[最优解释]
java 是按值传递的,所有的对象都是。没有引用传递一说。
这里的值是指引用地址的值。
public static void setMethod(String a, String b) {
a = "10";
b = "20";
}
这里的 a= "10",是指将对象a的地址又赋给 "10"这个字符串的地址去了。
但是 外同的a和这里的a,并不是同一个对象,它们只不过是恰好共享了同一个内在而已。你现在把里面的a的内存指向改了,但这个改变不了外面的对象的指向的。
上面的解释从C++来解释,理解很抽象,但这是java的精粹,你不了解这个。其他的很多都不会了解的。
在java中 =从来都是修改该对象的值所在的地址,即不能改变对象本身的值的。
比如:
a = b;
a = c;
原来的b还是b,而a只不过转向c的地址去了而已。
而你上面的stringbuilder,他的append方法,是修改自己内部的属性,并没有修改自己的地址引用,这个对象的引用还是原来的那一个。
对象重新赋值和修改属性,这两个操作要分开理解。
[其他解释]
LZ,首先我也和你纠正一下,在java中,传递的都是按值传递,没有传地址的说法,因为在java里面,对与引用的话,传的是地址的值。
这里和 引用的关系不是很有关。
为什么会打印出上面的情况呢?
其实你要从 Strin 和 StrinBuffer 的属性去出发。
平时我们说的字符串,输出的都是 String,注意:String一旦被创建,它的值自始直终都不可以再变了,而StringBuffer是可以变的,但是我们要打印出来的时候也要将它转换成为 String(你可以去看看规范),(上面其实是自动转换的(print的时候)。
[其他解释]
public class StringTest3
{
public static void main(String[] args) {
testMethod();
}
public static void testMethod() {
String i = new String("a");
String k = new String("b");
StringBuffer a = new StringBuffer("AAA");
StringBuffer b = new StringBuffer("BBB");
setMethod(a, b);
setMethod(i, k);
System.out.println(a); // AAABBBCCC
System.out.println(b);//BBBAAADDD
System.out.println(i);//a
System.out.println(k);//b
}
public static void setMethod(StringBuffer a, StringBuffer b) {
a.append("BBBCCC");
b.append("AAADDD");
}
public static void setMethod(String a, String b) {
a = "10";
b = "20";
System.out.println(a); //这样就能输出了,
System.out.println(b);
}
}
在值传递的过程中,始终传的是值,在java中没有传引用这一说。
a = "10";
b = "20";
这是定义在方法体内的两个量,会给他们分配内存,可是这两个量的值,不会因为实际参数的改变而改变,因为这两个参数的作用域仅在方法体,他们可以和实际参数共享一个内存,他不会改变实际参数的地址。仅仅是指向的地址变了
[其他解释]
代码是想考你: StringBuffer和String的区别
前者内容可以改变,后者不可以改变
所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。
[其他解释]
lz,字符串是一个不可变类型,一经创建不可更改String s1 = new String("123");和String s2 = "123";仔细体会下两者的区别,相信你会有所收获。
[其他解释]
这么说吧,你记住两点就OK了:
1,对于简单类型 和 String strABC = "123"; 这两种定义是值传递。
2,其余的所有对象都是引用传递。
至于 概念上就不要纠结了,没有意义。
[其他解释]
楼上的已经说的差不多了,在java中,只有值传递,其实研究太多也没有什么意思。另外,string一旦指定,其值是不变的,之所以有变的,是因为重新赋值,会让变量指向一个新的内存地址。
[其他解释]
怎么都木有人过来回复
[其他解释]
还是有点没明白,为什么a = "10"; b = "20"; 的值没有被更新掉....
[其他解释]
该回复于2012-11-28 09:29:42被管理员删除
[其他解释]
这个好像比较容易理解