public static void main(String[] args) {
StringBuilder b1 = new StringBuilder("a");
StringBuilder b2 = new StringBuilder("b");
op(b1,b2);
System.out.println(b1+","+b2); // 结果为 ab,b 为什么??
}
public static void op(StringBuilder b1, StringBuilder b2){
b1.append(b2);
b2 = b1;
}
入门基础 Java参数传递方式
1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象( 70-305 ),方法调用结束后,原来对它的引用并没用指向新的对象。
代码如下:
public class Tester {
public static void main(String[] args) {
int primitive = 2;
changePrimitive(primitive);
//primitive的值依然是2
MyClass myClass = new MyClass();
changeObject(myClass);
//myClass仍然指向的是执行changeObject之前的那个对象
//但是myClass.i等于3了
}
public static void changePrimitive(int primitive) {
primitive = 3;
}
public static void changeObject(MyClass myClass) {
myClass.i = 3;
myClass = new MyClass();
}
}
class MyClass {
int i;
}
方法是传值的。调用方法时,b2指针拷贝了一份传入方法,在方法内部改变了这个拷贝的指针的值,但是原来的b2并没有改变
[code="java"]public static void main(String[] args) {
// 创建一个"a"的StringBuilder对象,b1是这个对象的引用
StringBuilder b1 = new StringBuilder("a");
// 创建一个"b"的StringBuilder对象,b2是这个对象的引用
StringBuilder b2 = new StringBuilder("b");
// 调用op方法,把引用b1,b2传递给op
op(b1,b2);
System.out.println(b1+","+b2); // 所以结果ab,b
}
public static void op(StringBuilder b1, StringBuilder b2){
// b1指上面的对象"a",append后修改了"a"这个对象,变成ab
b1.append(b2);
// 把b1的引用赋给b2,也就是b2指向了"ab",上面b2引用的对象并没有变化
b2 = b1;
} [/code]
传递给op方法的两个参数其实是b1,b2这两个对象在内存中的地址的拷贝;对b1调用了append方法,就是对这个地址上的对象进行了某种程度的修改,最终b1还是指向原来的地址,但是在该地址的对象已经改变了;而b2=b1;这个语句只是单纯的将b1这个对象的地址赋值给了b2,由于b2只是一个拷贝,所以最终原来的b2还是指向new StringBuilder("b")这块内存空间,所以不变。