当前位置: 技术问答>java相关
一道scjp题,关于传值和传引用
来源: 互联网 发布时间:2015-04-19
本文导语: What is the output of the following code? 1. public class Note { 2. public static void main(String args[]) { 3. String name[] = {"Killer","Miller"}; 4. String name0 = "Killer"; 5. String name1 = "Miller"; 6. swap(name0,name1); 7. System.o...
What is the output of the following code?
1. public class Note {
2. public static void main(String args[]) {
3. String name[] = {"Killer","Miller"};
4. String name0 = "Killer";
5. String name1 = "Miller";
6. swap(name0,name1);
7. System.out.println(name0 + "," + name1);
8. swap(name);
9. System.out.println(name[0] + "," + name[1]);
10. }
11. public static void swap(String name[]) {
12. String temp;
13. temp=name[0];
14. name[0]=name[1];
15. name[1]=temp;
16. }
17. public static void swap(String name0,String name1) {
18. String temp;
19. temp=name0;
20. name0=name1;
21. name1=temp;
22. }
23. } // end of Class Note
answer is : Miller,Killer followed by Killer,Miller (调试是这个答案)
我觉得是 killer,miller,killer,miller
string 不是对象吗?
对象在方法里是传引用的,为什么String没有被交换呢?
改成String name0=new String("killer") 还是这个答案,不理解!
1. public class Note {
2. public static void main(String args[]) {
3. String name[] = {"Killer","Miller"};
4. String name0 = "Killer";
5. String name1 = "Miller";
6. swap(name0,name1);
7. System.out.println(name0 + "," + name1);
8. swap(name);
9. System.out.println(name[0] + "," + name[1]);
10. }
11. public static void swap(String name[]) {
12. String temp;
13. temp=name[0];
14. name[0]=name[1];
15. name[1]=temp;
16. }
17. public static void swap(String name0,String name1) {
18. String temp;
19. temp=name0;
20. name0=name1;
21. name1=temp;
22. }
23. } // end of Class Note
answer is : Miller,Killer followed by Killer,Miller (调试是这个答案)
我觉得是 killer,miller,killer,miller
string 不是对象吗?
对象在方法里是传引用的,为什么String没有被交换呢?
改成String name0=new String("killer") 还是这个答案,不理解!
|
to javalearner()
“对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。”
“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。”
我上面的解释都是针对这两段话的,你后面的话我太长了我也没有仔细看。
我想说,为了你这句话,我特地找了那个例子来试试的,xhh(霹雳游侠)说的确实是对的。
再看看你自己吧,第一次说传值,第二次说传引用,且在解释不通的时候,得出了“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value”的结论,这就是你对底层理解的结果么?还是你对底层理解了但你不会表达?我倒是很想问问你这种“底层机制”到底是什么,你又深究出什么了?不过,你既然想沉默了,那我也不说废话了。
P.S:指针的概念你说的很对,你一定要把引用说成“强安全性的指针”也对,因为你了解C,但如果对于一个从来没有学过C的人或是学的不好的人,你和他这样说,或许会有点困扰。我学的不好,所以我不想困扰。
“对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。”
“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。”
我上面的解释都是针对这两段话的,你后面的话我太长了我也没有仔细看。
我想说,为了你这句话,我特地找了那个例子来试试的,xhh(霹雳游侠)说的确实是对的。
再看看你自己吧,第一次说传值,第二次说传引用,且在解释不通的时候,得出了“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value”的结论,这就是你对底层理解的结果么?还是你对底层理解了但你不会表达?我倒是很想问问你这种“底层机制”到底是什么,你又深究出什么了?不过,你既然想沉默了,那我也不说废话了。
P.S:指针的概念你说的很对,你一定要把引用说成“强安全性的指针”也对,因为你了解C,但如果对于一个从来没有学过C的人或是学的不好的人,你和他这样说,或许会有点困扰。我学的不好,所以我不想困扰。
|
to Hiraku:好啦,我们已经背离了初衷了,我没有强调对象在传递给method()时时pass-by-value,这是我没做好的一点,我承认,可是我说传值和传引用都是有前提的,千万别断章取义,你可能以为我c学的好,其实不是,我直接学的就是c++和OO,面向过程的编程恐怕我就是学的汇编了(其实用汇编也可以实现初步的数据封装等初级OO),所以我从来不提c,对不熟悉的事物我从来不敢乱说。
我一开始正是因为霹雳先生没有说明白和正确我才出来解释的,请你理解,谢谢。
我一开始正是因为霹雳先生没有说明白和正确我才出来解释的,请你理解,谢谢。