日期:2014-05-20  浏览次数:20689 次

java代码,说说输出结果,和原因,刚学java ,有点不是很理解。
class  Test{

public static void main(String[] args) {
String s1 = new String("java"); 
String s2 = new String("hello");
method_1(s1,s2);
System.out.println(s1+"...."+s2); //java....hello

StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22); 
}
public static void method_1(String s1,String s2){
s1=s1.replace('a','k');

s1 = s2;

}
public static void method_2(StringBuilder s1,StringBuilder s2){
s1.append(s2);

s1 = s2;

}
}

------解决方案--------------------
method1调用后无变化,method2调用后有变化。

字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。
------解决方案--------------------
引用:
method1调用后无变化,method2调用后有变化。

字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。
严重错误,怎么能误导人家初学者
------解决方案--------------------
引用:
引用:method1调用后无变化,method2调用后有变化。

字符串类型在java里是一种特殊类型,类似于int等基本类型。method1传的是值,method2传的是引用。严重错误,怎么能误导人家初学者


我怎么误导了,应该不会啊,我虽没用运行,但是觉得理论上应该是的啊。
method1调用后,应该不变,这个应该没有异议。
method2调用后,s1.append(s2);这一句肯定会改变s1的值,但是s1 = s2;并不会改变s2,所以打印出来应该是java hello hello,hello会被重复一次。
我想应该是这样。
------解决方案--------------------
字打错了,应该是"但是s1 = s2;并不会改变s1和s2,"
------解决方案--------------------
方法1中,接收了两个引用,这个引用指向了一个对象,拿s1举例,我们假设这个对象的地址是0001,s1被重新赋值过,(也就是=过)这时,s1就指向了新地址0002,可是0001里面还是原来的对象。
然后方法执行完了之后,方法内的s1没了,可是外面的s1还是指向的0001。而0001里面还是原来的字符串。

方法2中,接收的也是两个引用,拿s1举例,s1.append(s2);会直接对0001这个地址进行操作,这样的话0001里面的字符串就变了,第二行s1=s2,这个局部的s1的引用就指向了s2的引用,比如是0003,然后方法返回,局部的s1和s2都销毁了,方法外输出的时候,0001里的对象已经变了
------解决方案--------------------
引用:
方法1中,接收了两个引用,这个引用指向了一个对象,拿s1举例,我们假设这个对象的地址是0001,s1被重新赋值过,(也就是=过)这时,s1就指向了新地址0002,可是0001里面还是原来的对象。
然后方法执行完了之后,方法内的s1没了,可是外面的s1还是指向的0001。而0001里面还是原来的字符串。

方法2中,接收的也是两个引用,拿s1举例,s1.append(……

那方法一中,
s1=s1.replace('a','k');
这个操作怎么没有效果?
------解决方案--------------------
我也不懂!
------解决方案--------------------
字符串类型和int等基本类型是有差别的
------解决方案--------------------

------解决方案--------------------
输出结果为
java....hello
javahello-----hello
------解决方案--------------------
引用:
引用:方法1中,接收了两个引用,这个引用指向了一个对象,拿s1举例,我们假设这个对象的地址是0001,s1被重新赋值过,(也就是=过)这时,s1就指向了新地址0002,可是0001里面还是原来的对象。
然后方法执行完了之后,方法内的s1没了,可是外面的s1还是指向的0001。而0001里面还是原来的字符串。

方法2中,接收……


这个操作其实是有效果的,在method_1()方法内你用System.out.println()语句将s1和s2打印出来可以验证s1和s2被"暂时"改变了,只是在调用此方法之后,该方法占用的内存会被释放,也就是说,传参数的时候是传的一份原变量s1和s2的拷贝,所以对原变量无影响,楼主如果有c语言的基础应该这些能够理解