读书人

java代码说说输出结果跟原因刚学

发布时间: 2013-04-20 19:43:01 作者: rapoo

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;

}
}
[解决办法]
字符串类型和int等基本类型是有差别的
[解决办法]
java代码,说说输出结果,跟原因,刚学java ,有点不是很理解
[解决办法]
输出结果为
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语言的基础应该这些能够理解


[解决办法]


[解决办法]
//得先说说赋值语句:String s1 = new String("java"); 相当于给了一个箱子1,这个箱子1的钥匙是s1,这个箱子1里放了个苹果,"java"就是这个苹果,而这个箱子1就是内存中的一块。
//接下来method_1(s1,s2);这个方法调用的意思就是新配了一把钥匙s1,这个钥匙也能开上面那个箱子1,这是引用传递,但由于string是不变对象,是值传递,所以method_1(s1,s2)(引用传递就理解为新配一把钥匙,值传递就理解为把箱子里的东西复制一份放到另外的箱子里面)
//传给参数s1的不是钥匙,而是苹果。意思就是有了另外一个箱子2,钥匙是参数s1,箱子2里也有个苹果。而method_1里面的s1=s1.replace('a','k');改变的是箱子2里的苹果。箱子1里面的
//东西根本没变,而method_1(s1,s2);调用的作用域在main函数里,main函数里的s1是指第一个箱子,所以第一个输出java....hello。这样就不难理解method_2了。method_2(s11,s22);
//这个方法调用是指给箱子3 s11配了把钥匙s1,给箱子4 s22配了把钥匙s2(因为stringbuffer是引用传递,不是string那样的值传递),method_2函数里的s1.append(s2);这句话表明用s1
//这把钥匙打开箱子3,给他加了个梨。现在箱子3里就有梨和苹果了(javahello),s1=s2这句话就是把s1这把钥匙打磨下能打开箱子4了,就不能打开箱子3了。但是注意,箱子3的原配钥匙s11并
//没有变化,还是打开箱子3,现在变的是箱子3里面的东西。method_2(s11,s22);这个方法调用的作用域在main方法里,所以s11打开箱子3(javahello),s22打开箱子4(hello)输出结果是
//javahello----hello
[解决办法]
楼上关于箱子和钥匙的比喻很形象啊,哈哈。但是我不太清楚java里面是不是只有值传递,这一点不太确定。
[解决办法]
膜拜上面这几位
[解决办法]
我又网上查阅了一下,感觉JAVA里面还是只有值传递,不过分为两种情况:
1)对于int、float等八种基本类型的对象,传递的是他本身的内容值(箱子里面的苹果)
2)对于String、定义的类等其他类型的对象,传递的是他在内存中的地址值(箱子的钥匙)
建议看一看这位仁兄的论述和代码http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html
[解决办法]
坐等高手说明。

个人认为


[解决办法]
java....hello
javahello-----hello
String类的对象不可以对内容进行动态的操作,比如删减增加字符
method——1中s1 = S2 只是对地质进行了赋值而没有对字符串内容进行改变所以不能改变内容


而StringBuilder是一个可变的字符序列类 ,和StringBuffer都是对字符串进行动态操作的类所以可以改变内容
[解决办法]
String是mutable类型,做为参数传入方法时是传值,所以第一个方法不改进传进去的String。
StringBuilder不是mutable类型,所以做为参数传入方法时是传引用(java的引用概念和C++不太一样),所以第二个方法会改变传入的值
[解决办法]


[解决办法]

[解决办法]
String和StringBuilde的区别,String 定义的变量是不可变的,StringBuilde是可以进行操作的

读书人网 >J2SE开发

热点推荐