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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张校云 黑马帝   /  2011-9-30 19:51  /  2300 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]public class Test {
        public static void main(String[] args){
                int[] array = new int[1];
                int i = 0;
                method_1(array,i);
                System.out.println(array[0]+" "+i);
        }
        public static void method_1(int[] array,int i){
                array[0] = 1;
                i = 1;
        }
}[/code]这个程序中,有一个数组和一个int型变量,用method_1()方法分别改变数组和i的值,为什么最后数组被更改了,i的值却没有更改依然是0,基础不好,求解

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-9-30 20:15:19
沙发

原始值是否被改变,关键看你的传递方式

原始值是否被改变,关键看你的传递方式
1 按值传递,函数操作的是原值的拷贝,自然改变不了原始值,慢,但安全,结构默认的就是这种传递方法。在用数组名做函数的参数时,把实参数组的起始地址传递给形参数组名,这样两个数组就共用同一段内存单元! 假设实参a的起始地址与形参b的起始地址相同,则a和 b占同一段的存储单元,a[0]和b[0]同占一单元,a[1]和b[1]同占一个存储单元......所以,形参数组中的各元素的值的改变也会使实参的值发生改变.!这里的int i便是按值传递。
2 按引用及指针,都是对原值的操作,通过传递地址实现,速度快,不安全,可加const解决,数组默认的传递方法。  int[]array便是按引用。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-30 21:11:57
藤椅
为了区分 把main()方法里的i=0称为i1=0,public static void method_1(int[] array,int i){}里的i称为i2.
首先你执行main方法的时候 会在栈内存中分配一个变量i1=0; 当你调用method_1(int[] array,int i2)这里的i2是形参也分配在栈内存中,因为值传递,相当于你把i1= 0 的值附给了i2,i1自己的值没变!所以现在内存里的i2=0,method_1方法内部又执行i2 = 1;所以现在栈内存中的情况是i1=0和i2=1;方法执行结束之后,为这个方法分配的变量的内存空间会全部消失,所以i2消失,只剩下I1=0,接着被打印出来。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-10-2 17:48:30
板凳
因为数组是引用类,而int是基本数据类型
关于方法参数的传递,这里有一篇非常经典的文章,希望使你更好的理解:
[url]http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html[/url]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
[code=java]class Test
{
        
        public static void main(String[] args){
               
                int[] array = new int[1];
               
                int i = 0;
               
                int a =method_1(array,i);
                i = a;
                 
               
                System.out.println(array[0]+" "+i);
        
        }
        
        public static int method_1(int[] array,int i)
        {
         
                  array[0] = 2;
                i = 1;
                return i;
               
        }
}[/code]因为i是基本数据类型,所以主函数和method函数中的i在内存中不是指向同一个地址值,由于是按值传递,函数操作的是原值的拷贝,自然改变不了原始值。所以method函数中i的改变并不是对主函数i的改变。如果想让i值改变,那就用一个变量记住改变的值。然后在将此变量的值赋予主函数中的i。
array是引用型数据变量,所有2个函数中的array指向的都是同一个地址值。所以用method_1方法对array改变时。主函数中的array自然也会被改变。
[ 本帖最后由 陈晓东 于 2011-10-04  17:17 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-10-5 11:30:29
地板
01.public class Test {
02.        
public static void main(String[] args){
03.               
int[] array = new int[1];
04.               
int i = 0;
05.               
method_1(array,i);
06.               
System.out.println(array[0]+" "+i);
07.        
}
08.        
public static void method_1(int[] array,int i){
09.               
array[0] = 1;
10.               
i = 1;
11.        
}
12.}
在俩个函数中的i其实作用域不相同,在method_1中的i只在method_1中i=1;而主函数的i并不是method_1中的那个,所以依然还是0
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马