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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


大家帮我看看,是我代码错了还是我对返回值的理解错了
下面是输出结果


评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

17 个回复

倒序浏览
数组其实是容器,new的是对象在堆里,当交换值时,其实已经修改了堆里面的值,在这里a0到a4已经是54321

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
数组不是基本数据类型,传进方法中的是地址的引用,fun4()操作的就是数组中的内容,所以既是没有返回值也是更改后的结果。如果是基本数据类型,没有返回值就不会发生变化了。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25咯~

查看全部评分

回复 使用道具 举报
fun4是没有返回值,便是fun4(a)之后,我就排序了int a[] = {5,4,3,2,1};

然后你用a[0]+a[1]=5+4=9了。。。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
首先你fun4这个方法是对数组进行从大到小排序的,虽然没有返回类型,但是它可以把数组重新排序。也就是说你执行完fun4(a)这句后,数组已经排序好了。
你执行fun3(a)的时候不是把数组打印出来了吗,它是按照从大到小的顺序打印出来的。说明已经排序好的,这时候前2个元素相加就是9了。
没有返回值类型并不代表不执行这个方法,只不过在你原数组的基础上加工了一下而已,就好比一个玻璃杯里从上到下放着一些带数字的球,一开始是无序的,这个玻璃杯就是数组,这些球就是数组中的元素,你在调用fun4方法时相当于你把杯中的球按照从大到小的顺序排了序,这时候你再打印数组,它肯定是有序的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你这个数组首先调用的是fun4(),fun()是排序,fun4()不返回值,但是排序了,s调用的排序之后的数组,是a【0】+a【1】=9,再者建议你直接用发帖里面的传入代码。这样表较好调试

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
ld5128702 发表于 2013-4-8 22:48
你这个数组首先调用的是fun4(),fun()是排序,fun4()不返回值,但是排序了,s调用的排序之后的数组, ...

我把那个遍历语句删了,s的值还是9
回复 使用道具 举报
我按照你的代码运行了一下,没错呀!???请你再重开doc命令运行一下!

2013-04-08_225217.png (2.1 KB, 下载次数: 45)

2013-04-08_225217.png
回复 使用道具 举报
饶正林 发表于 2013-4-8 22:53
我按照你的代码运行了一下,没错呀!???请你再重开doc命令运行一下!

不好意思,发错了图片!!! 我也纳闷了!这问题还是等好答案!
回复 使用道具 举报
你好,
你对数组在内存中的理解是不对的。  
"a"是一个引用变量,在栈内存中,"a"用来指向堆内存中数组实体的位置。
当你用冒泡法后改变了堆内存数组中元素的位置(由大到小),所以你排序后这个数组实体因是这样的:{5,4,3,2,1},
所以这是a[0]+a[1]——>5+4=9


给你画个图助于理解:




如果还是不懂,请下载 ”2012年毕向东最新Java基础视频“ 地址http://edu.csdn.net/java/video.shtml
看看3-17集后

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
fun调用传入的a  你并不是具体的内容,而是一个数组类型的引用,如果你学过C语言的话,可以用指针来说明a
它就是一个指向数组头元素的引用型变量.
你将a 传入给 fun函数,就是将要操作的数组的地址告诉了fun函数,fun函数就直接操作了a 中的元素 操作完之后并不需要返回

举个例子.

我找同学去帮我寝室打扫卫生,
我同学就相当于 fun函数,  可是 我能把我寝室当作参数传给他吗? 不是的,我把我寝室的位置(地址告诉了他)他根据地址的引用找到了我的寝室,然后开始扫地,扫地好了就走了,我寝室的卫生也被打扫干净了.

而不是像楼主理解的那样,我复制了一个寝室,然后给了我同学 他打扫完的是复制的寝室.我自己的寝室其实没变.

传入的a是地址引用,而不是带有具体元素的数组,a就是告诉了 fun   嗨 哥们 我的元素 都在这 你来操作吧,fun操作完后走了,a的元素也被改变了!



额 回答的有点乱,还望楼主能耐心.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~

点进自己的帖子,编辑->标题左侧有下拉菜单->改变分类->保存~
回复 使用道具 举报
数组时引用类型,你调用fun4()冒泡法排序,改变了堆内存中数组a中元素的顺序,使得a= {2,4,3,1,5}变成了a = {5,4,3,2,1};自然a[0] = 5,a[1] = 4;所以 s = a[0] +a[1] =9
自然输出结果s是等于9哦、、、、

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
在你的fun4()方法中,已经进行了排序
数组它不属于基本数据类型,JAVA是强类型语言,数组的引用引用的是地址值。
也就是说,在内存中,排序后,它就已经发生了改变。
a[0]和a[1]已经不是一开始的它了

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
int[] a={2,4,3,1,5} fun4()函数对数据进行了降序排序,,数组引用指向了排序后的数组,int[] a = {5,4,3,2,1};,而fun3()只是打印了一下该数组,所以a[0]+a[1]=9; 5+4=9

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这个其实挺简单的,就是你把排序完成后的a[0]和a[1]相加了,如果你把那个输出代码a[0]+a[1]的代码,放在排序前的话,就会输出你想要的结果了。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你通过fun4()函数对数据进行了降序排序后,数组的值已经是54321.那么a[0]+a[1]的值也就是5+4=9了。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
陈丽莉 发表于 2013-4-9 00:01
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~

点进自己的帖子,编辑->标题左侧有下拉菜 ...

yes sir:lol:lol:lol:lol

点评

应该是 Yes,madam~  发表于 2013-4-9 22:17
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马