public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x = x.append(y);
y = x;
}请问输出结果,并请大侠们解释一下
y = x;//只是改变了y的指向,b不受影响
但是x.append(y);改变了x地址指向的内容,所以a的内容也会改变
x = x.append(y);//这里的x是引用传递。一般对象都是引用传递,但是。。
y = x;//但是当你改变引用传递的对你的时候,这个对象就会new 新创建。
我也是乱说的。
a,b,x,y
二个对象
new StringBuffer("A") //object1
new StringBuffer("B") //object2执行前
a指向object1
b指向object2
x指向object1
y指向object2执行后
x = x.append(y) //object1内容变成(AB),x指向object1
y = x //y指向object1a指向object1
b指向object2所以打印出AB ,B (object2内容无变化)
class Letter{
char c;
}
public class PassObject {
static void f(Letter y){
y.c = 'z';
}
public static void main(String[] args) {
Letter x = new Letter();
x.c ='a';
print("1: x.c " + x.c);
f(x);
print("2: x.c " + x.c);
}
}
因为传到operator方法中的是两个StringBuffer对象的拷贝,在operator方法中的任何赋值操作都不会影响原来对象的值,但是x.append(y)既改变了拷贝内容也改变了原对象的值。
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b); }
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}把代码改成这样,结果还是AB,B。
证明赋值操作确实没有影响到a,b,影响的是x.append(y)
public void change(String str,char ch[],int i){
str="test ok";
ch[0]='g';
i++;
}
}public class Test8 {
public static void main(String args[]){
String str="good";
char ch[]={'a','b','c'};
int i=3;
Change cha=new Change();
cha.change(str,ch,i);
System.out.println(str);
System.out.println(ch);
System.out.println(i);
}
}
结果为:
good
gbc
3
可见数组和其它类型不一样,传的是地址,结果改变这里需要解释一下,java基本类型(byte、int、char、long、float、double、boolean和short)是传值,也就是传的是副本,而其余传的是引用(所谓引用传递就是把对象的引用地址传进函数,而不是像值传递那样产生一个副本),对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理--视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是产生一个副本对其进行操作,对其进行的操作不会影响原来的值。这就是为什么字符串和数组都是引用传递,字符串没变而数组变了的原因String传的是值,改变的是局部变量的值,对其他范围没有影响。
Char[] 传的是地址,改变值就等于改变了内存中原先的数组的值。
故答案为: good and gbc
传参问题,不知道楼主有没有学过C语言,有学过的话,理解起来问题不大!