黑马程序员技术交流社区

标题: 有个疑问! [打印本页]

作者: 黑马张平    时间: 2012-3-10 17:22
标题: 有个疑问!
class ArrDemo
{
        public static void main(String[] args)
        {
                int[] arr=new int[]{0,5,6,7,8,9,10};
                System.out.println("arr.length="+arr.length);
                printAll(arr);
       
               
        }
        public static void printAll(int[] a)
        {
                for (int x=0;x<arr.length ;x++ )
                {
                        System.out.println("arr["+x+"]="+arr[x]+",");
                }
        }
}
为什么这个函数编译不了?
我明明传进来的是数组 arr,后来怎么就变成a了呢?即使a也指向 数组arr,  按道理arr也还是指向 new int[][]{0,5,6,7,8,9,10}才对。求高手指教。 函数形参 与实参的区别!

作者: 倪鹏博    时间: 2012-3-10 17:30
这涉及到参数的作用范围:
函数中arr没有定义,虽然在类中定义了,但是它的作用范围不能深入到函数之内;
数组a是在函数中定义的,执行函数的时候,是把arr所指的地址赋值给了a,a只能在函数之中起作用;
所以你的代码会提示错误
作者: 刘雷冲    时间: 2012-3-10 17:34
本帖最后由 刘雷冲 于 2012-3-10 17:37 编辑

public static void printAll(int[] arr) {
                for (int x=0;x<arr.length ;x++ ) {
                        System.out.println("arr["+x+"]="+arr[x]+",");
                }
}

注:明显是数组名称的不对应啊,应该有错,无法运行吧
作者: 李明伟    时间: 2012-3-10 18:06
正确的代码应该是这样的:
public class ArrDemo
{
        public static void main(String[] args)
        {
                int[] arr=new int[]{0,5,6,7,8,9,10};
                System.out.println("arr.length="+arr.length);
                printAll(arr);
        
               
        }
        public static void printAll(int[] a)
        {
                for (int x=0;x<a.length ;x++ )
                {
                        System.out.println("arr["+x+"]="+a[x]+",");
                }
        }
}

在上述代码中,在main方法中调用printAll方法,main方法内定义有数组arr,当调用printAll时将Arr的引用当做参数传递给形参a,

在printAll方法定义时,你所定义的形式参数是a,所以方法内应该使用a,而不是arr。
作者: 李明伟    时间: 2012-3-10 18:07
正确的代码应该是这样的:
public class ArrDemo
{
        public static void main(String[] args)
        {
                int[] arr=new int[]{0,5,6,7,8,9,10};
                System.out.println("arr.length="+arr.length);
                printAll(arr);
        
               
        }
        public static void printAll(int[] a)
        {
                for (int x=0;x<a.length ;x++ )
                {
                        System.out.println("arr["+x+"]="+a[x]+",");
                }
        }
}

在上述代码中,在main方法中调用printAll方法,main方法内定义有数组arr,当调用printAll时将Arr的引用当做参数传递给形参a,

在printAll方法定义时,你所定义的形式参数是a,所以方法内应该使用a,而不是arr。
作者: 冯旭君    时间: 2012-3-10 18:09
实参顾名思义就是实际传进去的参数,形参只是一个形式的参数。形参的意义就是你调用此方法将对什么操作或者是把将要传进来的变量(即实际的对象或者说变量)干什么事情。我例如:String中有valueOf()方法,这里面就需要传进去参数,有boolean型、有int型等,就是想把什么东西转换成String类型的。如你写的对方法就是想要把数组打印出来,怎么得到数组,只能传进去,可是在编程的时候你并不知道是传进去哪个数组,所以你必须先起一个名字(即形参),你可以把这个形参想象成你将要传进来 的数组,然后对其操作。其实形参在内存中是不存在的,实参在内存中存在的。
作者: 黑马张平    时间: 2012-3-10 19:34
学习,学习。还要多想想!
作者: 蒋安国    时间: 2012-3-10 20:36
首先纠错:printAll方法中arr应改为a,实际上实参实际上传递给形参后就相当于:int[] a = new int[]{0,5,6,7,8,9,10};等于让a再指向这个对象。至于你说的arr和a都是这个对象的引用这是正确的,但是arr不能在printAll方法中操作,因为它们的作用范围不同,形参和实参都是局部变量,什么是局部变量呢?方法内和参数列表中定义的变量都是局部变量,局部变量如果不是静态的,都是在栈中的,它们只在自己的函数内有效,如果是在函数内某个代码区域中定义的,例如for语句中,那么只在这个区域中有效,你的arr和a分别属于不同的函数,所以只能在各自的函数内使用,这与它们是否指向同一个对象无关,纯粹是作用域的问题。
作者: 青春再次喧哗    时间: 2012-5-14 11:43
哎、我怎么看不懂啊?




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