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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红霞 中级黑马   /  2012-7-10 03:57  /  1891 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红霞 于 2012-7-10 15:51 编辑

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //这个结果就正确输出
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

输出结果是:5, 2, 4

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
因为上面你是初始化给数组分配的空间,就分配了一个空间c[0],所以写c[1]就越界了。
而下面你写c[0]=4就是改变了原来空间里面的值,就是4替换掉了3并保留下来了。

评分

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

查看全部评分

回复 使用道具 举报
因为数组下标越界了, int[] c={3},数组中虽然有一个元素,但是他的角标是从0开始的,也就是0、1、2、3、4、、、、。数组的实际长度应该是:arr.length-1才正确,希望我的回答对你有所帮助!{:soso_e100:}
回复 使用道具 举报
public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};      //这里将数组定义成长度为1的数组,里面只有一个元素
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?    //这里给数组修改角标为1(第二个元素)的元素,就会数组角标越界,下面的程序修改的是角标为0的元素,就没有问题。
     }

评分

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

查看全部评分

回复 使用道具 举报
public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};    //你定义的数组里只有一个数,角标是从0开始的
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?  这里的角标是1 了,角标越界了
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //这个结果就正确输出
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}
回复 使用道具 举报
这个程序主要涉及两个问题,一、内存分配;二参数传递。通过g(b,c)方法调用,public void g(int b, int[] c) {
       a = 5;
       b = 8; //这里是一个值类型传递,结果b的值不会改变
       c[0]=4; //这里是一个引用传递 ,首先c[]这个数z子这个方法中只是进行了声明定义,并没有在内存中分配空间,它是根据传递进来的数组空进大小而确定的,因为传递 进来的数组只分配了一个空间大小 所以在此只能引用c[0], 另外,数组是引用类型传递,所 以c[0]结果为4
}
回复 使用道具 举报
本帖最后由 姬仁贵 于 2012-7-11 15:50 编辑

public class Demo2
{
    int a;
    int b;
    int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3}; //将3这个元素存入到数组C里面,也就是说c里面就一个元素。
       g(b, c); //调用g函数。
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //因为C数组里面就一个元素,因为数组下表是从0开始的,当数组里就一个元素时数组的下标为0;即C[0]=4;所以在这里c[1]=4会出现角标越界的错误。
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //因为这里数组的角标是正确的,所以会输出正确。在这里c[0]=4将4代替为C[0]里面以前的元素。
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}
至于输出结果为什么是:5, 2, 4
因为g(b, c)这条语句里面的b是通过值传递给 public void g(int b, int[] c) 的,
public void g(int b, int[] c) {
       a = 5;
       b = 8; //这里对b的操作不会影响到print_1()里面的b。
       c[0]=4;
    }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马