JAVA引用、非引用[菜鸟求解]

玉女 2012-11-26 05:13:19

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给值后,应该是更新引用区域的值,为什么没有被更新掉!!!
...全文
304 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
玉女 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 hanzhaoshuai 的回复:
代码是想考你: StringBuffer和String的区别 前者内容可以改变,后者不可以改变 所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。
这个好像比较容易理解
玉女 2012-11-27
  • 打赏
  • 举报
回复
引用 2 楼 Fly_m 的回复:
java 是按值传递的,所有的对象都是。没有引用传递一说。 这里的值是指引用地址的值。 public static void setMethod(String a, String b) { a = "10"; b = "20"; } 这里的 a= "10",是指将对象a的地址又赋给 "10"这个字符串的地址去了。……
还是有点没明白,为什么a = "10"; b = "20"; 的值没有被更新掉....
lxy15329 2012-11-27
  • 打赏
  • 举报
回复
楼上的已经说的差不多了,在java中,只有值传递,其实研究太多也没有什么意思。另外,string一旦指定,其值是不变的,之所以有变的,是因为重新赋值,会让变量指向一个新的内存地址。
chenhongxin 2012-11-27
  • 打赏
  • 举报
回复
这么说吧,你记住两点就OK了: 1,对于简单类型 和 String strABC = "123"; 这两种定义是值传递。 2,其余的所有对象都是引用传递。 至于 概念上就不要纠结了,没有意义。
溪梦灬缘梦 2012-11-27
  • 打赏
  • 举报
回复
lz,字符串是一个不可变类型,一经创建不可更改String s1 = new String("123");和String s2 = "123";仔细体会下两者的区别,相信你会有所收获。
兆帅 2012-11-27
  • 打赏
  • 举报
回复
代码是想考你: StringBuffer和String的区别 前者内容可以改变,后者不可以改变 所谓的“引用传递” ,我理解就是 按值传递 ,只是前者内存内容可以操纵,后者不可操纵。
zhaoming262350 2012-11-26
  • 打赏
  • 举报
回复
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"; 这是定义在方法体内的两个量,会给他们分配内存,可是这两个量的值,不会因为实际参数的改变而改变,因为这两个参数的作用域仅在方法体,他们可以和实际参数共享一个内存,他不会改变实际参数的地址。仅仅是指向的地址变了
wonkju 2012-11-26
  • 打赏
  • 举报
回复
LZ,首先我也和你纠正一下,在java中,传递的都是按值传递,没有传地址的说法,因为在java里面,对与引用的话,传的是地址的值。 这里和 引用的关系不是很有关。 为什么会打印出上面的情况呢? 其实你要从 Strin 和 StrinBuffer 的属性去出发。 平时我们说的字符串,输出的都是 String,注意:String一旦被创建,它的值自始直终都不可以再变了,而StringBuffer是可以变的,但是我们要打印出来的时候也要将它转换成为 String(你可以去看看规范),(上面其实是自动转换的(print的时候)。
Fly_m 2012-11-26
  • 打赏
  • 举报
回复
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方法,是修改自己内部的属性,并没有修改自己的地址引用,这个对象的引用还是原来的那一个。 对象重新赋值和修改属性,这两个操作要分开理解。
玉女 2012-11-26
  • 打赏
  • 举报
回复
怎么都木有人过来回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧