A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿磊 中级黑马   /  2014-8-5 00:06  /  3351 人查看  /  57 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 阿磊 于 2014-8-16 00:56 编辑

class  Test
{
        public static void main(String[] args)
        {
                String str1 = "abcde";
                String str2 = "abc";        
                swap(str1,str2);
                System.out.println("str1="+str1+"::"+"str2="+str2);//输出结果    str1=abcde::str2=abc
                if(str1.length()>str2.length()){
                        String temp = str1;
                        str1 = str2;
                        str2 =  temp;
                }        
                System.out.println("str1="+str1+"::"+"str2="+str2);输出结果  str1=abc::str2=abcde
        
        }
        public static void swap(String str1,String str2){
               
                if(str1.length()>str2.length()){
                        String temp = str1;
                        str1 = str2;
                        str2 =  temp;
                }
        }

}
为啥两次的输出结果不一样,求解答!!!!

57 个回复

倒序浏览
本帖最后由 fxwb2005 于 2014-8-5 00:39 编辑

swap方法里面交换的两个变量根本不是上面main方法里面的,你交换的只是两个参数的值而已,所以swap方法没有起到作用。
回复 使用道具 举报
fxwb2005 发表于 2014-8-5 00:37
swap方法里面交换的两个变量根本不是上面main方法里面的,你交换的只是两个参数的值而已,所以swap方法没 ...

我调用了方法,传入了参数,怎么会不是操作的这个数据呢,那别的的方法都能用吗?你在看看这个图片能说明点问题。
回复 使用道具 举报 0 1
阿磊 发表于 2014-8-5 00:58
我调用了方法,传入了参数,怎么会不是操作的这个数据呢,那别的的方法都能用吗?你在看看这个图片能说明 ...

对,你操作的是数据,也就是str1和str2两个变量所指向的对象。但是,你没有也不可能操作str1和str2两个变量本身。因为Java方法的参数传递是值传递,你传入的是str1和str2的值,也就是str1和str2指向的对象的地址值,你只能操作对象,而不能操作指向对象的变量
回复 使用道具 举报 0 1
fantacyleo 发表于 2014-8-5 01:22
对,你操作的是数据,也就是str1和str2两个变量所指向的对象。但是,你没有也不可能操作str1和str2两个变 ...

那为什么调用方法不能换位,而直接在主函数中写代码就可以换位呢?并且调用方法的时候str1和str2的值确实有传进去啊,都打印出了结果了。那入股说String是一个对象int型数据呢 ? 如下代码:
class  Test2
{
        public static void main(String[] args)
        {
                int str1 = 3;
                int str2 = 1;       
                swap(str1,str2);
                System.out.println("3str1="+str1+"::"+"3str2="+str2);//输出 3str1=3::3str2=1
                if(str1>str2){
                        int temp = str1;
                        str1 = str2;
                        str2 =  temp;
                }       
                System.out.println("4str1="+str1+"::"+"4str2="+str2);//输出 4str1=1::4str2=3
       
        }
        public static void swap(int str1,int str2){
        System.out.println("1str1="+str1+"::"+"1str2="+str2);//输出  1str1=3::1str2=1
                if(str1>str2){
                        int temp = str1;
                        str1 = str2;
                        str2 =  temp;
                }
        System.out.println("2str1="+str1+"::"+"2str2="+str2);//输出 2str1=1::2str2=3
        }

}


回复 使用道具 举报
swap()函数里面是值传递 就是str1和str2复制一份拷贝给swap()函数进行操作 没有改变它们自身的值
在main函数中 操作的str1和str2是地址,所以它们自身的值改变了 所以两次输出的结果不一样。
回复 使用道具 举报
本帖最后由 fantacyleo 于 2014-8-5 02:21 编辑
阿磊 发表于 2014-8-5 01:45
那为什么调用方法不能换位,而直接在主函数中写代码就可以换位呢?并且调用方法的时候str1和str2的值确实 ...

对啊,你往swap中传的是str1和str2的值,那么str1和str2的值是什么?是对象"abcde"和对象"abc"的内存地址,所以你在swap中只能改变"abcde"和"abc"(实际上由于字符串是不可变对象,你也改变不了),不可能改变str1和str2。这就好比,你(str1)的考卷("abcde")做好了交给老师批改(swap),老师可以在你的考卷上进行评分、打钩或画叉(swap中的代码),从而改变你考卷的卷面,但不可能改变这张考卷属于你(str1始终指向"abcde")这个事实。
回复 使用道具 举报
阿磊 发表于 2014-8-5 01:45
那为什么调用方法不能换位,而直接在主函数中写代码就可以换位呢?并且调用方法的时候str1和str2的值确实 ...

再打个比方吧:你这次考试得了80分,回到家你爸问你成绩。你拿出一张纸,写上80。你爸很不满意,拿起笔把80划掉,写上90,说”你下次必须考到90以上“。好,你写在纸上的80分,和你的考试成绩80分,只不过值相等而已,但它们是两件完全不同的东西,所以不管你爸怎么涂改你写在纸上的分数,都不可能改变你这次考试的分数是80这件事,对吧?方法的参数传递也一样,swap方法只是接收到str1和str2的值,就像在纸上写上了80分,无论你在swap中怎么折腾(涂改写在纸上的80分),都不影响str1和str2
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 02:20
再打个比方吧:你这次考试得了80分,回到家你爸问你成绩。你拿出一张纸,写上80。你爸很不满意,拿起笔把 ...

那是不是每个方法都不管用了呢?方法不都是这么调用的吗?如果说因为他们是字符串的原因,那要是int型的不是对象了吧,但为什么也是不行呢。。。。。和字符串一样一样的。
回复 使用道具 举报
阿磊 发表于 2014-8-5 08:18
那是不是每个方法都不管用了呢?方法不都是这么调用的吗?如果说因为他们是字符串的原因,那要是int型的 ...

跟是不是对象没关系,参数传递都是值传递。String str1的值是"abcde"的内存地址,int str1的值是3,这两个值不可能通过参数传递而在另一个方法中被改变
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 01:22
对,你操作的是数据,也就是str1和str2两个变量所指向的对象。但是,你没有也不可能操作str1和str2两个变 ...

这位大神已经分析的很详细了,很赞同。
回复 使用道具 举报
本帖最后由 200米王朝 于 2014-8-5 09:33 编辑

class  Test
{
         public static void main(String[] args)
        {
                 String str1 = "abcde";
                 String str2 = "abc";        
                swap(str1,str2);  //该函数没有返回值,也没有system.out.println(),所以调用该函数没有任何结果。
                 System.out.println("str1="+str1+"::"+"str2="+str2);//输出结果    str1=abcde::str2=abc
                 if(str1.length()>str2.length()){
                         String temp = str1;
                         str1 = str2;
                         str2 =  temp;  //这里说的是如果前前者字符串长度大于后者就换位,因为str1长度大于str2,所以换位。
                 }        
                System.out.println("str1="+str1+"::"+"str2="+str2);输出结果  str1=abc::str2=abcde
         
        }
         public static void swap(String str1,String str2){
                 
                if(str1.length()>str2.length()){
                         String temp = str1;
                         str1 = str2;
                         str2 =  temp;    //这里str1和str2和上面main函数中的str1,str2是2个完全不同的概念,虽然他们名字碰巧相同。
                 }
         }

}
回复 使用道具 举报
LFW 中级黑马 2014-8-5 09:38:36
13#
我也发帖了,swap(String str1,String str2)的确换到了,但并没有将结果传回给调用者,原因是什么我不知道,所以发帖了
回复 使用道具 举报
LFW 发表于 2014-8-5 09:38
我也发帖了,swap(String str1,String str2)的确换到了,但并没有将结果传回给调用者,原因是什么我不知道 ...

是啊 上面讲的我都晕晕的。。。还真没懂。。。。郁闷了!
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 02:20
再打个比方吧:你这次考试得了80分,回到家你爸问你成绩。你拿出一张纸,写上80。你爸很不满意,拿起笔把 ...

非常形象!
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 09:09
跟是不是对象没关系,参数传递都是值传递。String str1的值是"abcde"的内存地址,int str1的值是3,这两 ...

感觉还是晕晕的,能不能帮忙简单的画个图助于理解理解呢?还有数组里面换位,用的也是viod无返回值的,但是那个就可以成功。。。费解,拜托了,真心想弄明白!

点评

这论坛有bug,mac电脑无法上传图片。。。等晚上我换了win给你画个图吧  发表于 2014-8-5 09:50
回复 使用道具 举报
阿磊 发表于 2014-8-5 09:47
感觉还是晕晕的,能不能帮忙简单的画个图助于理解理解呢?还有数组里面换位,用的也是viod无返回值的,但 ...

哦哦  好的  感谢啊  坐等你的好消息
回复 使用道具 举报
LFW 中级黑马 2014-8-5 09:54:54
18#
fantacyleo 发表于 2014-8-5 09:09
跟是不是对象没关系,参数传递都是值传递。String str1的值是"abcde"的内存地址,int str1的值是3,这两 ...

那数组的互换swap又怎么实现的?又或者说,我就是希望能抽取出一个将长str2短str1子串,换成短str2长str1的子串    的功能。那怎么做。我就是没明白,为什么数组的互换可以调用方法实现而这个不行。
回复 使用道具 举报
LFW 发表于 2014-8-5 09:54
那数组的互换swap又怎么实现的?又或者说,我就是希望能抽取出一个将长str2短str1子串,换成短str2长str1 ...

还是我打的那个比方:假定有个数组int[] a = {1,2,3}  你(a)的考卷({1,2,3})做好了交给老师批改(swap),老师可以在你的考卷上进行评分、打钩或画叉,从而改变你考卷的卷面({1,2,3}变成了{2,1,3}),但不可能改变这张考卷属于你(a始终指向{1,2,3},或者说后来的{2,1,3}的内存地址)这个事实。你所谓的数组互换,要求的是改变卷面,这是可以的。楼主要求的互换是说把自己的考卷换成别人的,这件事在Java中无法通过参数传递来实现
回复 使用道具 举报
调用交换函数是复制是传递值,交换函数里交换成功,但是只仅限也函数内,和原来的值没关系
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马