问题描述
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; }
解决方案二:
传递给op方法的两个参数其实是b1,b2这两个对象在内存中的地址的拷贝;对b1调用了append方法,就是对这个地址上的对象进行了某种程度的修改,最终b1还是指向原来的地址,但是在该地址的对象已经改变了;而b2=b1;这个语句只是单纯的将b1这个对象的地址赋值给了b2,由于b2只是一个拷贝,所以最终原来的b2还是指向new StringBuilder("b")这块内存空间,所以不变。
解决方案三:
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传递给opop(b1,b2);System.out.println(b1+","+b2); // 所以结果ab,b}public static void op(StringBuilder b1, StringBuilder b2){// b1指上面的对象"a",append后修改了"a"这个对象,变成abb1.append(b2);// 把b1的引用赋给b2,也就是b2指向了"ab",上面b2引用的对象并没有变化b2 = b1;}
解决方案四:
方法是传值的。调用方法时,b2指针拷贝了一份传入方法,在方法内部改变了这个拷贝的指针的值,但是原来的b2并没有改变