黑马程序员技术交流社区

标题: 数组的返回值,是我理解错了,还是代码错了,求指教 [打印本页]

作者: U芽Lady    时间: 2013-4-8 22:30
标题: 数组的返回值,是我理解错了,还是代码错了,求指教

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



作者: Keith    时间: 2013-4-8 22:40
数组其实是容器,new的是对象在堆里,当交换值时,其实已经修改了堆里面的值,在这里a0到a4已经是54321
作者: 王梦南    时间: 2013-4-8 22:43
数组不是基本数据类型,传进方法中的是地址的引用,fun4()操作的就是数组中的内容,所以既是没有返回值也是更改后的结果。如果是基本数据类型,没有返回值就不会发生变化了。
作者: 王溢君    时间: 2013-4-8 22:45
fun4是没有返回值,便是fun4(a)之后,我就排序了int a[] = {5,4,3,2,1};

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

作者: ld5128702    时间: 2013-4-8 22:48
你这个数组首先调用的是fun4(),fun()是排序,fun4()不返回值,但是排序了,s调用的排序之后的数组,是a【0】+a【1】=9,再者建议你直接用发帖里面的传入代码。这样表较好调试
作者: U芽Lady    时间: 2013-4-8 22:52
ld5128702 发表于 2013-4-8 22:48
你这个数组首先调用的是fun4(),fun()是排序,fun4()不返回值,但是排序了,s调用的排序之后的数组, ...

我把那个遍历语句删了,s的值还是9

作者: 饶正林    时间: 2013-4-8 22:53
我按照你的代码运行了一下,没错呀!???请你再重开doc命令运行一下!

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

2013-04-08_225217.png

作者: 饶正林    时间: 2013-4-8 23:02
饶正林 发表于 2013-4-8 22:53
我按照你的代码运行了一下,没错呀!???请你再重开doc命令运行一下!

不好意思,发错了图片!!! 我也纳闷了!这问题还是等好答案!
作者: liuyangyang    时间: 2013-4-8 23:03
你好,
你对数组在内存中的理解是不对的。  
"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集后
作者: 曹宇    时间: 2013-4-8 23:47
fun调用传入的a  你并不是具体的内容,而是一个数组类型的引用,如果你学过C语言的话,可以用指针来说明a
它就是一个指向数组头元素的引用型变量.
你将a 传入给 fun函数,就是将要操作的数组的地址告诉了fun函数,fun函数就直接操作了a 中的元素 操作完之后并不需要返回

举个例子.

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

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

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



额 回答的有点乱,还望楼主能耐心.
作者: 陈丽莉    时间: 2013-4-9 00:01
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~

点进自己的帖子,编辑->标题左侧有下拉菜单->改变分类->保存~
作者: 林声荣    时间: 2013-4-9 00:39
数组时引用类型,你调用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哦、、、、
作者: 黄辉    时间: 2013-4-9 03:39
在你的fun4()方法中,已经进行了排序
数组它不属于基本数据类型,JAVA是强类型语言,数组的引用引用的是地址值。
也就是说,在内存中,排序后,它就已经发生了改变。
a[0]和a[1]已经不是一开始的它了
作者: 黑马李杰    时间: 2013-4-9 07:17
int[] a={2,4,3,1,5} fun4()函数对数据进行了降序排序,,数组引用指向了排序后的数组,int[] a = {5,4,3,2,1};,而fun3()只是打印了一下该数组,所以a[0]+a[1]=9; 5+4=9
作者: 田富丰    时间: 2013-4-9 13:34
这个其实挺简单的,就是你把排序完成后的a[0]和a[1]相加了,如果你把那个输出代码a[0]+a[1]的代码,放在排序前的话,就会输出你想要的结果了。
作者: 杨武林    时间: 2013-4-9 13:48
你通过fun4()函数对数据进行了降序排序后,数组的值已经是54321.那么a[0]+a[1]的值也就是5+4=9了。
作者: U芽Lady    时间: 2013-4-9 22:09
陈丽莉 发表于 2013-4-9 00:01
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~

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

yes sir:lol:lol:lol:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2