黑马程序员技术交流社区

标题: 为什么int型变量的值没有被更改? [打印本页]

作者: 张校云    时间: 2011-9-30 19:51
标题: 为什么int型变量的值没有被更改?
[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,基础不好,求解
作者: 匿名    时间: 2011-9-30 20:15
标题: 原始值是否被改变,关键看你的传递方式
原始值是否被改变,关键看你的传递方式
1 按值传递,函数操作的是原值的拷贝,自然改变不了原始值,慢,但安全,结构默认的就是这种传递方法。在用数组名做函数的参数时,把实参数组的起始地址传递给形参数组名,这样两个数组就共用同一段内存单元! 假设实参a的起始地址与形参b的起始地址相同,则a和 b占同一段的存储单元,a[0]和b[0]同占一单元,a[1]和b[1]同占一个存储单元......所以,形参数组中的各元素的值的改变也会使实参的值发生改变.!这里的int i便是按值传递。
2 按引用及指针,都是对原值的操作,通过传递地址实现,速度快,不安全,可加const解决,数组默认的传递方法。  int[]array便是按引用。
作者: 匿名    时间: 2011-9-30 21:11
为了区分 把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,接着被打印出来。
作者: 匿名    时间: 2011-10-2 17:48
因为数组是引用类,而int是基本数据类型
关于方法参数的传递,这里有一篇非常经典的文章,希望使你更好的理解:
[url]http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html[/url]
作者: 陈晓东    时间: 2011-10-4 17:16
[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
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




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