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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿磊 中级黑马   /  2014-8-5 00:06  /  3282 人查看  /  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 个回复

正序浏览
dreamseekerkun 来自手机 中级黑马 2014-8-6 01:09:52
51#
我是来学习的
回复 使用道具 举报
威猛的小熊 来自手机 高级黑马 2014-8-5 23:46:16
50#
学习学习。。。
回复 使用道具 举报
刘小印 发表于 2014-8-5 23:34
你应该没搞懂局部变量把,而且字符串是不能被修改的,

现在差不多懂了 在大牛们的帮助下  模模糊糊懂了  呵呵
回复 使用道具 举报
你应该没搞懂局部变量把,而且字符串是不能被修改的,
回复 使用道具 举报

多谢多谢。。。。:handshake
回复 使用道具 举报
阿磊 发表于 2014-8-5 22:44
哦 哦 大概有点明白了,看的很清楚,现在如果换成其他的参数也是一样的吧?那数组的换位我能这样理解吗? ...

嗯,正确
回复 使用道具 举报
我是来学习的。。。。
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 21:22
画了两张内存图:
1. main函数调用swap函数,将参数传递完毕但swap函数中的代码尚未开始执行前

哦 哦 大概有点明白了,看的很清楚,现在如果换成其他的参数也是一样的吧?那数组的换位我能这样理解吗?就是方法和mian函数一样都指向了数组的地址值,但是方法操作的是数组内部的元素,换了位置,但是mian仍然指向它,所以在数组内部换位以后,主函数中要操作数组仍然是同一个数组,但是它已经换位了,这样理解可以吗?
回复 使用道具 举报
swap方法进栈后,将地址值赋值了一份,也执行了方法内的换值,但是swap出栈后,打印的还是主函数里面的值,第二个确实是在主函数中互换了,所以打印的值变化了。如果你想swap方法也可以交换字符串的话,就需要将交换后的字符串返回给调用者,并打印,那么结果肯定是改变了。
回复 使用道具 举报
画了两张内存图:
1. main函数调用swap函数,将参数传递完毕但swap函数中的代码尚未开始执行前

可以看到,swap函数中的str1和str2与main函数中的同名变量是两回事,只不过它们有相同的值——对象所在的堆地址值(这里就不考虑常量池了),这就是所谓的值传递。除了值相同以外,两个函数的同名变量之间是独立的,互不干扰

2. swap函数中的代码尚执行完毕后

尽管swap函数中的str1和str2交换了指向,但不影响main函数中的str1和str2的指向

评分

参与人数 1黑马币 +5 收起 理由
阿磊 + 5 很给力!

查看全部评分

回复 使用道具 举报
去看看核心技术卷一 115页4.5方法参数,对java传递参数机制有详细说明
回复 使用道具 举报
swap方法中的str1和str2跟主方法中的两个字符串名字相同,但是它们不是同一个字符串。
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 11:49
原因是你只互换了getMaxSubString函数中的两个string,就像你在swap中一样能看到效果,但对getMaxSubStri ...

貌似有点懂了,但是还是希望你给个图哈  晚上等你消息,让我更加明白:lol
回复 使用道具 举报
本帖最后由 Darkhorse′Xa 于 2014-8-5 17:35 编辑

了解一下值传递和引用传递就懂了.
但是Java里头只有值传递
回复 使用道具 举报
本帖最后由 怀念黑海岸 于 2014-8-5 17:27 编辑
阿磊 发表于 2014-8-5 17:17
这个例子的话有点了解了,但是还不全懂  呵呵,就是对于数据类型和String都是不可能改变地址值的,但是对 ...

你不管字符串数据是引用类型还是基本类型,原因主要在于他们都是存储于常量池中的,而对象都是存在于堆内存中的,用这个方法来区分对待这个问题,你就能轻松的理解了。
你只需记住,调用函数时往函数里面传参数,其实都传的是具体的数值,不同在于对于基本数据类型和字符串,是直接将传入的数据先复制一份,然后再将复制的这份传进去,你怎么修改穿进去的数据都是修改复制版本,他本身是不会改变的。而传递的是引用数据类型的话就是传递这个对象的地址,那么你方法里的任何对对象操作都会导致你会直接修改传进去的这个对象。
回复 使用道具 举报
怀念黑海岸 发表于 2014-8-5 12:05
可以简而概之:当我们往一个方法里面传递参数时,如果这个参数是基本数据类型包括String,那么实际上传递进 ...

这个例子的话有点了解了,但是还不全懂  呵呵,就是对于数据类型和String都是不可能改变地址值的,但是对于一个对象的话就是可以的
回复 使用道具 举报 1 0
使用swap函数,传入的值只是原来值的一个拷贝,在函数中并没有改变原来的值,如改变原来的值使用传地址值方式,
回复 使用道具 举报
各种分析各种回复各种比喻
回复 使用道具 举报
6楼正解。。。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马