提问:为啥在Operate这个方法中运行后,X的值改变,但Y没有
代码:
package test; public class Daniel { static void operate(StringBuffer x,StringBuffer y){ System.out.println("x="+x); System.out.println("y="+y); x.append(y); System.out.println("x="+x); System.out.println("x.toString()="+x.toString()); y=new StringBuffer(x.toString()); System.out.println("y="+y); System.out.println("------------------------"); } public static void main(String[] args) { StringBuffer a =new StringBuffer("X"); StringBuffer b =new StringBuffer("Y"); operate(a,b); System.out.println("a="+a); System.out.println("b="+b); System.out.println(a +","+b); } }
输出结果:
x=X
y=Y
x=XY
x.toString()=XY
y=XY
------------------------
a=XY
b=Y
XY,Y
分析:
在operate()方法中,已经将“x”,“y”重新赋值,“x”,“y”都等于xy,但是在运行operate()后面的程序时,“a”的值变成xy而“b”的值没有变,这是为什么了?
在主函数中调用类的含参方法的运行轨迹:
主函数注入(参数) ---->注入(参数),在类方法中运行(重新赋值和运算)--输入结果--->被其他的类的方法调用--->输出结果;
在这个过程中实际上是单个方法本身对注入的参数的值进行改变,并没有对注入的参数(对象本身)进行改变。所以在其他类方法调用该参数本身是,任然是初始值。在这里值得注意的是:应为StringBuffer()类中的append();insert();delete();reverse();replace()等方法,是可以对对象本进行修改和操作的...
扩展:
StringBuffer a =new StringBuffer("X"); System.out.println("a的字符数是"+a.capacity()); System.out.println("a的长度是"+a.length());
输出结果:
--a的字符数是17
--a的长度是1
StringBuffer a=New StringBuffer(); 默认的是16char。
下面是一个与上面例子相关的题目,试试写出结果:
package test;
public class App {
int x=1;
public static void getNew(int x,int y){
y+=x;
x+=y;
System.out.println("getNew()中y="+y);
System.out.println("getNew()中x="+x);
}
public static int getChange(int x,int y){
y+=x;
x+=y;
return x;
}
void getChanged(int x,int y){
y+=x;
x+=y;
this.x=x;
}
public static void main(String[] args) {
int x=10;
int y=5;
getNew(x,y);
System.out.println("x="+x+" and y="+y);
getChange(x,y);
System.out.println("getChange()中的x="+getChange(x,y));
System.out.println("x="+x+" and y="+y);
App t=new App();
System.out.println("t.x="+t.x);
t.getChanged(x, y);
System.out.println("t.x="+t.x);
System.out.println("x="+x+" and y="+y);
}
}
输出结果:
getNew()中y=15
getNew()中x=25
x=10 and y=5
getChange()中的x=25
x=10 and y=5
t.x=1
t.x=25
x=10 and y=5
原创请勿转载.......