关于一个java构造函数中的append方法操作的问题。
publicclassTest13{publicstaticvoidmain(Stringargs[]){StringBuffera=newStringBuffer("A...
public class Test13{
public static void main(String args[]){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
System.out.println("at first:a="+a+"\t"+"b="+b);
method(a,b);
System.out.println("outter:a="+a+"\t"+"b="+b);
}
static void method(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
System.out.println("inner:a="+x+"\t"+"b="+y);
}
}
谁能告诉我为什么在method方法内部x和y已经同为“AB”,回到main后却又成了a=AB,b=B?搞不懂。
谢谢各位高手赐教。
谢谢回答。
我想问的是:在method方法中x.append(y)可以写作x=x.append(y)吧
为什么同样是x=x.append(y)和y=x两个传值操作,x就可以作为形参传值给main里的a,y就不能最为形参传值给main里的b?
是否和append()函数的特性有关?
PS:to jonny404
根据目前我所了解的一点java的皮毛,好像是说java采用的是传值调用,不是采用地址调用,你的解释是否有误呢?
再次感谢各位的回答,还希望能够的到更详细的解释,谢谢。 展开
public static void main(String args[]){
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
System.out.println("at first:a="+a+"\t"+"b="+b);
method(a,b);
System.out.println("outter:a="+a+"\t"+"b="+b);
}
static void method(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
System.out.println("inner:a="+x+"\t"+"b="+y);
}
}
谁能告诉我为什么在method方法内部x和y已经同为“AB”,回到main后却又成了a=AB,b=B?搞不懂。
谢谢各位高手赐教。
谢谢回答。
我想问的是:在method方法中x.append(y)可以写作x=x.append(y)吧
为什么同样是x=x.append(y)和y=x两个传值操作,x就可以作为形参传值给main里的a,y就不能最为形参传值给main里的b?
是否和append()函数的特性有关?
PS:to jonny404
根据目前我所了解的一点java的皮毛,好像是说java采用的是传值调用,不是采用地址调用,你的解释是否有误呢?
再次感谢各位的回答,还希望能够的到更详细的解释,谢谢。 展开
4个回答
展开全部
这么解释吧,java里面的方法的参数,只是把当前对象指向的地址给参数,
你的这个方法里
StringBuffer a=new StringBuffer("A");
//这一行,假设a指向了内存地址为4000的地方
StringBuffer b=new StringBuffer("B");
//这一行,假设b指向了内存地址为5000的地方
method(a,b);
//这个方法只是把a和b的地址传了过去。x指向4000,y指向5000,a与b还是指向原来的地址。
x.append(y);
//这句将a指向地址的内容变了。
y=x
//只是将y指向的地址发生变化,变为4000,而main程序中的b还指向5000
所以在main程序中输出时,还是B,因为那块内存的内容没有变化。
这么解释明白么?
你的这个方法里
StringBuffer a=new StringBuffer("A");
//这一行,假设a指向了内存地址为4000的地方
StringBuffer b=new StringBuffer("B");
//这一行,假设b指向了内存地址为5000的地方
method(a,b);
//这个方法只是把a和b的地址传了过去。x指向4000,y指向5000,a与b还是指向原来的地址。
x.append(y);
//这句将a指向地址的内容变了。
y=x
//只是将y指向的地址发生变化,变为4000,而main程序中的b还指向5000
所以在main程序中输出时,还是B,因为那块内存的内容没有变化。
这么解释明白么?
展开全部
是这样的,假设
new StringBuffer (“A”); 为内存1
new StringBuffer (“B”); 为内存2
a - 内存1
b- 内存2
方法的参数是引用的复制。虽然指向的是同一内存区域,但却是不同的句柄。
operate (StringBuffer x, StringBuffer y)
x - 内存1
y- 内存2
当 y = x时,你是改变了 y 的引用指向,而不是 b 的,这里你操作这块内存是没有问题的,但你这样改变了引用的指向,也就是
x - 内存1
y- 内存1
这样对B指向的内存没有影响。
稍改了一下你代码,你看一下,这时Y已指向内存1了。
-------------
public class Foo {
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;
y.append("C");
}
}
ABC,B
求采纳
new StringBuffer (“A”); 为内存1
new StringBuffer (“B”); 为内存2
a - 内存1
b- 内存2
方法的参数是引用的复制。虽然指向的是同一内存区域,但却是不同的句柄。
operate (StringBuffer x, StringBuffer y)
x - 内存1
y- 内存2
当 y = x时,你是改变了 y 的引用指向,而不是 b 的,这里你操作这块内存是没有问题的,但你这样改变了引用的指向,也就是
x - 内存1
y- 内存1
这样对B指向的内存没有影响。
稍改了一下你代码,你看一下,这时Y已指向内存1了。
-------------
public class Foo {
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;
y.append("C");
}
}
ABC,B
求采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你怎么理解引用
static void method(StringBuffer x,StringBuffer y){
y这个参数开始引用的是StringBuffer b
在y=x 这个语句后引用的就是a了
这并不会改变 在main方法中b的引用
结果是没有错的
static void method(StringBuffer x,StringBuffer y){
y这个参数开始引用的是StringBuffer b
在y=x 这个语句后引用的就是a了
这并不会改变 在main方法中b的引用
结果是没有错的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
方法定义实际上就是通过将两个字符流然后转换成一个字符流。
代码如下:
static StringBuffer append(StringBuffer a,StringBuffer b){
a.append(b);
b=a;
System.out.println("b="+b.toString());
return b;
}
代码如下:
static StringBuffer append(StringBuffer a,StringBuffer b){
a.append(b);
b=a;
System.out.println("b="+b.toString());
return b;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询