class J_StringBuffer{
public static void main(String args[]){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
mb_operate(a, b);
System.out.println(a + "." + b);
} // End of method: main static void mb_operate(StringBuffer x, StringBuffer y){
x.append(y); //x=ab
y=x; //y的值与x的孩子相同
} // End of method: mb_operate
} // End of class: J_StringBuffer
上面程序的输出的为什么是 AB.B?
class J_Test{
public static void main(String args[])
{
int i= 99;
mb_operate(i);
System.out.print(i+100);
} // End of method: main
static void mb_operate(int i)
{
i+=100;//i的作用域不一样,所以两个i的值根本不一样。
} // End of method: mb_ operate
} // End of class: J_Test
这个输出的为什么是199?
public static void main(String args[]){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
mb_operate(a, b);
System.out.println(a + "." + b);
} // End of method: main static void mb_operate(StringBuffer x, StringBuffer y){
x.append(y); //x=ab
y=x; //y的值与x的孩子相同
} // End of method: mb_operate
} // End of class: J_StringBuffer
上面程序的输出的为什么是 AB.B?
class J_Test{
public static void main(String args[])
{
int i= 99;
mb_operate(i);
System.out.print(i+100);
} // End of method: main
static void mb_operate(int i)
{
i+=100;//i的作用域不一样,所以两个i的值根本不一样。
} // End of method: mb_ operate
} // End of class: J_Test
这个输出的为什么是199?
x = 2;
}int x=1;
f(x);
你说x变了吗?
否则你没有改变y的值,只是将y的引用指向了x,当跳出mb_operate这个方法之后,b的值并没有改变,所以打印出来的是AB.B。问题2:和问题1一样,你使用Integer类的对象就可以了,而int是基本类型,在mb_operate方法中并没有改变main方法中i的值。
a------------>A<--------------x
b------------>B<--------------ya------------>AB<-------------x.append(y)
a------------>AB<--------------y=x结果:
a------------>AB
b------------>BStringBuffer是个引用数据类型,传的是引用地址
x.append(y)
当两个引用指向同一个值的时候,形参改变其中的值的时候
实参自然也会改变
y=x
只是把x的地址赋给了y,使y与x指向了相同的地址
但这和b是没有关系的,b指向的地址没有改变总结:
引用传递,形参改变值的话,实参的值也会改变
形参改变地址的话,和实参没有关系遇到这种题,一定要画内存图,是个万金油的方法
光靠看不但浪费时间还容易出错。注意:
Sting类型是个特殊的对象,处理起来会有不同
楼主要注意一下,今天没有时间了,有时间再讨论讨论。第二题:
自然是值传递了,改变形参的值和实参是没有关系的。
第二个程序你自己也写了 两个i的作用域不同,所以方法mb_operate中的i的变化与main方法中的i无关,所以打印出来的就是99+100,也就是199
class J_StringBuffer{
public static void main(String args[]){
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
mb_operate(a, b);
System.out.println(a + "." + b);
} // End of method: main static void mb_operate(StringBuffer x, StringBuffer y){
x.append(y); //这个修改的是X引用指向的内容
y=x; //这个修改的是Y引用,Y是形参,方法返回后,Y自动清除,改变不会保留
} // End of method: mb_operate
} // End of class: J_StringBuffer
上面程序的输出的为什么是 AB.B?
class J_Test{
public static void main(String args[])
{
int i= 99;
mb_operate(i);
System.out.print(i+100);
} // End of method: main
static void mb_operate(int i)
{
i+=100;//这个i对main函数的i没有任何影响
} // End of method: mb_ operate
} // End of class: J_Test
这个输出的为什么是199?
因为你在最后把main函数的那个i加了100才打印的