public class test {
public static void stringReplace (String text) {
text = text.replace ('J' , 'I');
}
public static void bufferReplace (StringBuffer text){
text = text.append ("C");
}
public static void main (String args[]){
String textString = new String ("Java");
StringBuffer textBuffer = new StringBuffer ("Java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
在这个题目中输出的是JavaJavaC这到底是为什么呢?如果说是因为方法是无返回值的,那也应该是JavaJava啊,要不两个都改变应该是IavaJavaC啊,怎么一个改变另外一个不改变呢?
第2个问题,
public class test1 {
public static void add3 (Integer i){
int val = i.intValue ( );
val += 3;
i = new Integer (val);
}
public static void main (String args[]) {
Integer i = new Integer (0);
add3 (i);
System.out.println (i.intValue ( ) );
}}
输出是0我觉得和第一个问题应该是同一原因不知道是不是第3个问题
public class Foo {
public static void main (String [] args) {
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.println(a +","+b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}输出的是AB,B
但我觉得这个是不是也应该是AB,AB啊
这三个问题我的感觉好象是同一类型的,我分析半天不知道是什么原因!希望高手指点一二不胜感激
我在线等了!
public static void stringReplace (String text) {
text = text.replace ('J' , 'I');
}
public static void bufferReplace (StringBuffer text){
text = text.append ("C");
}
public static void main (String args[]){
String textString = new String ("Java");
StringBuffer textBuffer = new StringBuffer ("Java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
在这个题目中输出的是JavaJavaC这到底是为什么呢?如果说是因为方法是无返回值的,那也应该是JavaJava啊,要不两个都改变应该是IavaJavaC啊,怎么一个改变另外一个不改变呢?
第2个问题,
public class test1 {
public static void add3 (Integer i){
int val = i.intValue ( );
val += 3;
i = new Integer (val);
}
public static void main (String args[]) {
Integer i = new Integer (0);
add3 (i);
System.out.println (i.intValue ( ) );
}}
输出是0我觉得和第一个问题应该是同一原因不知道是不是第3个问题
public class Foo {
public static void main (String [] args) {
StringBuffer a = new StringBuffer ("A");
StringBuffer b = new StringBuffer ("B");
operate (a,b);
System.out.println(a +","+b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}输出的是AB,B
但我觉得这个是不是也应该是AB,AB啊
这三个问题我的感觉好象是同一类型的,我分析半天不知道是什么原因!希望高手指点一二不胜感激
我在线等了!
楼主可以去我博客看下,应该对你帮助
http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
另外呢 StringBuffer 的append()方法,text.append ("C"); 并没有改变原对象,只是把字符串"C"追加到原对象内字符后面而已。
x.append(y);通过.append()方法,这是操作对象的内容,x=AB了,能在原对象中放映出来。而y = x; 是直接对引用y赋值了,并不能在原对象中放映出来。
第一个问题,public static void stringReplace (String text)传的是textString的一个地址,
然后函数里text.replace ('J' , 'I'); 之后,相当于又创建了一个新的字符串Iava,然后它的
地址赋给text,则现在text里保存的是“Iava”的地址,改变这个地址不会影响到原字符串,而为什么
public static void bufferReplace (StringBuffer text)这函数会影响到原字符串呢,当然这
函数传的肯定也是地址,text = text.append ("C");这个操作执行了两个过程,第一个过程是
text.append ("C");即通过传过来的地址调用append方法,添加后,再将地址赋给text,也即是
说bufferReplace 方法中只写text.append ("C");,没有赋值,结果是一样的。下面两个问题和第一个问题是同一个问题,搞清楚第一个剩下的就简单了
int val = i[0].intValue ( );
val += 3;
i[0] = new Integer (val);
}
public static void main (String args[]) {
Integer[] i = new Integer[1];
i[0] = new Integer(0);
add3 (i);
System.out.println (i[0].intValue ( ) );
} }
然后我们来看看这个题目错在了什么地方,你的stringReplace使用了JAVA API中的replace方法,这个仅仅是你堆中的那个对象作了一个替换字符串的动作,并位改变池中的那个“Java”,当你离开了这个方法时,你的引用回来又重新指向“Java”,而StringBuffer的append操作的是就是原来的对象。
试着理解下面的例子:看看输出的结果是什么?
String s1 = "abc";
s1.replace('a', 'z');
System.out.println(s1);
StringBuffer st = new StringBuffer("abc");
st.replace(0, 1, "z");
System.out.println(st);
String和Integer的本质都是一个值,如果把值比作一个仓库的话,方法就是在某块空地上(栈的临时区域)重建了一个一模一样的仓库,原来的仓库设为A,后面的仓库设为B,那么调用了方法仅仅改变B仓库的物资(比如把土豆换成了芹菜),方法执行完毕后,原来的值还是指向A仓库,虽然B改变了但并没指向它(方法执行完毕之后其实方法【方法的参数也就无效了,所以仍然指向A仓库】和方法创建的B仓库实际上是等待垃圾回收了)
那么在什么情况下会改变原来的值呢,数组是一个典型的例子,数组的本质传入的是地址(形参复制的是句柄)。好比说如的是一个仓库的实际位置的钥匙A,现在重新配了把钥匙B,但还是指向这个仓库,那么改变B就是改变这个仓库中的东西了,等备用钥匙寿命结束(方法结束),在拿A去开仓库,这时候的仓库已经改变,比如ch[]={'c','a'},ch[]作为参数传递,当ch[0]='b'时这句话的含义是将ch所指向的内存偏移是0的内容存为“b”,也就是说ch所指的对象的内容被改变了,但是ch没有改变。
System.out.println(a),如果a是对象的引用,那么是把a指向的对象的值输出到控制台,而不是a的值输出到控制台。