日期:2014-05-20 浏览次数:20734 次
public class StringObject { String str; public static void main(String[] args) { StringObject so = new StringObject(); so.str = "abc"; System.out.println(so.str); so.str = "def"; System.out.println(so.str); so.union("ghi"); System.out.println(so.str); } public void union(String s) { str +=s; } }
------解决方案--------------------
1、String是final类型的,s="adc"创建后就丢在池里,你后面contact后就是新的对象,然后交给引用s.
2、x.contact(y)已经作用了,它创建了一个字符串对象,放在在String池里,只是你没有引用它;
y=x;此处也是起作用的,你在这句下面加个打印就知道了。
但回到main方法中:
String a="a"; //一个对象
String b="b"; //一个对象
按理说是一个引用的交换,但这里没有将a="b",到是与值类型相似了,这里我还真没有研究过,待高人指点。
3、结果不是已经交换了么?开始是 1,2,后面是2,1。难道我看错题了?
------解决方案--------------------
第一个问题看一下方法的源码就知道了
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this;//传入0长度的字符串返回自身 } char buf[] = new char[count + otherLen]; getChars(0, count, buf, 0); str.getChars(0, otherLen, buf, count); return new String(0, count + otherLen, buf);//返回新的字符串了 }
------解决方案--------------------
String是不可变的,如果出现+或者拼接的话都是重新建的一个,而是改变原来的,所以就会有三个,所以如果多的话还是用StringBuilder性能好很多。
String是属于对象,对象是引用,是将对象的地址传过去,而不是将值过去了。
你理解为传值也可以,不过记住普通的是传值,引用的是传地址
------解决方案--------------------
1.你对s重新赋值了。s=s.contact("def");
2.java是值传递的,你在operator里y=x,只改变的是operator方法里y的值,main方法里b还是指向“b”的
3.交换了啊,你可以执行交换方法前也打印下
------解决方案--------------------