看下面这段java程序:====================================public class Test{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y);
y = x;
}
}====================================为什么输出的是"AB,B",为什么不是"AB,AB"或者"A,B"呢?如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:====================================public class Test{
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(String x, String y) {
x.concat(y);
y = x;
}
}====================================为什么又输出"A,B"呢?
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y);
y = x;
}
}====================================为什么输出的是"AB,B",为什么不是"AB,AB"或者"A,B"呢?如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:====================================public class Test{
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(String x, String y) {
x.concat(y);
y = x;
}
}====================================为什么又输出"A,B"呢?
你说在所有的情况下thier values cannot be changed after they are created.
那显然不队
y = x;只是让y指向另外一个地方.
晕,这个我还是明白的,回复先看清楚别人问什么,这种回复简直废话
因为我觉得从我的提问很明显我是明白“y = x;只是让y指向另外一个地方.”的
----------
如果说:在void函数里,不能改变其reference参数指向,只能改变其内容,那下面这段程序又如何解释呢:
----------如果回复别人很明显已经知道的,那不是废话是什么
x=x.concat(y);
结果还是一样啊
说句谢谢,在告诉人家你的意思会死啊~!
看看:
楼上的又折回来了~!
nimifeng(现在只想学点东西)
人家怎么对你来着~!
什么人啊你~!
x.append (y); //和x=x.append (y); 效果一样
传址就是一种很特殊的传值,传的是一个引用(或称地址)
通过这个地址可以访问并改变这个引用指向对象的值。修改结果并不需要传回,因为修改是在原来的对象上作直接修改。
但是,这个地址的改变必须传回,不然就会丢失。
x.append(y)是直接修改x这个地址所指向的对象的值,而
y=x是把y这个地址换成了x这个地址,但是没有返回,所以一切不会有变化。
String类和concat()方法
StringBuffer类和append()方法
nimifeng(现在只想学点东西),第一回回复确实很无聊
我也没骂他waterwash(水洗)
希望你的下次回复最好是关于问题的
不要再在这个问题上纠缠了每个人的性格不一样
比如你看我说了别人的回复是废话很不爽
而我则看了别人回复是我明显知道很不爽谁都无法要求别人完全符合自己的标准
来csdn只想讨论问题
好好看看Api吧.
public static void test(String str) {
str = "World";
}
public static void main(String[] args) {
String string = "Hello";
test(string);
System.out.println(string);
}
}
运行结果:Hello
为什么会这样呢?因为参数 str 是一个引用,而且它与 string 是不同的引用,虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的值,使之指向了另一个对象,然而 str 指向的对象改变了,但它并没有对 "Hello" 造成任何影响,而且由于 string 和 str 是不同的引用,str 的改变也没有对 string 造成任何影响,结果就如例中所示。
就是String定义的是一个字符常量。是不可以改变的。就像 nimifeng(现在只想学点东西) 例子中:在main里,string = hello. 传给str的时候,则:string,str都等于"hello",而且指向同一内存空间。如果执行:str = "World";后,str 的值就是World了,可是不能改变string的值。而StringBuffer是动态分配内存空间的。所以1楼的代码就改变了x,y的值。但是由于作用域的不同,y等于了"AB",但是并没有改变b得值。b还是"B"。这段代码希望队楼主有帮助:public class haha
{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
b = a;
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y);
y = x;
System.out.println(x+ "," + y);
}
}输出结果:
AB,AB
AB,B这段代码:
public class haha
{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
b = a;
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y);
y = x;
System.out.println(x+ "," + y);
}
}输出结果:
AB,AB
AB,AB我刚学Java不久。如果我说的不对还请各位见谅。
AB,AB
AB,AB
因为加了b=a.
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b); // main里的引用 "a", "b"复制过后 赋给 operate 里的 "x", "y"
System.out.println(a + "," +b);
}
static void operate (StringBuffer x, StringBuffer y) {
x.append (y); // 直接在x 指向的内存区域后加上 y 指向的内容
// 此时 x 指向区域的内容已经改变,(和main 里的"a"指向同一区域)
y = x; // 将 引用"x" 赋给"y" (不是将"x"指向的内容赋给"y"指向的区域)
// 此时"x", "y" 和main里的 "a"指向同一块区域,main里的 "b"本身和其指向的内容都没有变化
}
}
====================================public class Test{
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(String x, String y) {
x.concat(y); // 唯一和上面不同的就是这一步,首先jvm会分配一个新的内存空间"*1",
// 然后在"*1"的后面加上引用"y"指向的内容。
// 此时 "x" 和 "x" 指向的内容都没有改变
// 另:如果是 x = x.concat(y); 则会将 "x"指向 "*1",但是x原来指向的内容还是不会改变
y = x;
}
}====================================
现在我似乎明白了,最关键是这句:
String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
明天上班结帖
因为我英文不好,所以看的就不是很耐心
今后应该加强这方面的学习了
pgemini1981(氷珏焱) 你的java学的真强啊!!
给我一些学习java 的经验啊!!
我才刚学习java啊!!!
不知道怎么学习她~~~~脑子里一头雾水不知道从何下手啊~~~~
555555555
望给以点学习的经验之谈~~~~
谢谢~~~
如果楼主编过C++,那么……在上面的代码中
operate函数原型等于C++里的:
static void operate(StringBuffer *x, StringBuffer *y) ;
(假设C++里有StringBuffer这种数据类型)
然后通过operate(&a, &b)调用
a,b实际上都是指向某个StringBuffer的指针
调用operate函数时是将两个与a,b指向相同StringBuffer对象的两个新的指针传递到函数内部
对新的指针进行操作
所以用x.append()能改变a和x共同指向的那个对象
但y=x改变的是y指针,不改变b指针而楼主原来对该代码的理解则是:
operate函数原型等于C++里的:
static void operate(StringBuffer &x, StringBuffer &y) ;
然后通过opearte(a,b)调用
StringBuffer是可变的,String是不可变的Strings are constant; their values cannot be changed after they are created.
x.append (y); //append是StringBuffer的方法;x.concat(y); //concat是String的方法
唧唧歪歪,像个女人,BS你
也就是相当于StringBuffer x = a;StringBuffer y = b; x, y, 和a,b, 是相互独立的?
请问各位是这样吗?
</Content>
fdajkfdja fdajfksjafda