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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张平 中级黑马   /  2012-3-10 17:22  /  2460 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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}才对。求高手指教。 函数形参 与实参的区别!

8 个回复

倒序浏览
这涉及到参数的作用范围:
函数中arr没有定义,虽然在类中定义了,但是它的作用范围不能深入到函数之内;
数组a是在函数中定义的,执行函数的时候,是把arr所指的地址赋值给了a,a只能在函数之中起作用;
所以你的代码会提示错误

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘雷冲 于 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]+",");
                }
}

注:明显是数组名称的不对应啊,应该有错,无法运行吧

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 确实是无法运行的

查看全部评分

回复 使用道具 举报
正确的代码应该是这样的:
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。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
正确的代码应该是这样的:
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。
回复 使用道具 举报
实参顾名思义就是实际传进去的参数,形参只是一个形式的参数。形参的意义就是你调用此方法将对什么操作或者是把将要传进来的变量(即实际的对象或者说变量)干什么事情。我例如:String中有valueOf()方法,这里面就需要传进去参数,有boolean型、有int型等,就是想把什么东西转换成String类型的。如你写的对方法就是想要把数组打印出来,怎么得到数组,只能传进去,可是在编程的时候你并不知道是传进去哪个数组,所以你必须先起一个名字(即形参),你可以把这个形参想象成你将要传进来 的数组,然后对其操作。其实形参在内存中是不存在的,实参在内存中存在的。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
学习,学习。还要多想想!
回复 使用道具 举报
蒋安国 黑马帝 2012-3-10 20:36:09
8#
首先纠错:printAll方法中arr应改为a,实际上实参实际上传递给形参后就相当于:int[] a = new int[]{0,5,6,7,8,9,10};等于让a再指向这个对象。至于你说的arr和a都是这个对象的引用这是正确的,但是arr不能在printAll方法中操作,因为它们的作用范围不同,形参和实参都是局部变量,什么是局部变量呢?方法内和参数列表中定义的变量都是局部变量,局部变量如果不是静态的,都是在栈中的,它们只在自己的函数内有效,如果是在函数内某个代码区域中定义的,例如for语句中,那么只在这个区域中有效,你的arr和a分别属于不同的函数,所以只能在各自的函数内使用,这与它们是否指向同一个对象无关,纯粹是作用域的问题。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
哎、我怎么看不懂啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马