public class Class3 {    public static void main(String[] args) {
    int i=5;
    int j[]={1,2,3,4};
    StringBuffer sb=new StringBuffer("abcde");
    a(i,j,sb);
    System.out.println("i=="+i);//为什么i的值是5而不是7?
    System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1。
    }
    static void a(int i,int j[], StringBuffer sb){
        i=7;
        j[0]=11;
        sb.append("fghij");
    }
            
}在程序的注释中已经表示了我的疑问,希望大家能帮我解决这个问题。

解决方案 »

  1.   

    i
      打印的i指的是 main中定义的i,不是在a()中定义的
      

  2.   

    那j[0]=11,却不是main()中的j[0]=1,你又如何解释呢?
      

  3.   

    "那j[0]=11,却不是main()中的j[0]=1,你又如何解释呢?"
    在a函数里面传入的是数组名,也就是数组的引用,相当于地址,所以在该函数中就
    是直接对传入得参数进行的修改
      

  4.   

    i=7; //改变了i 的指向,这时候,这个 i 已经和main中的i并不是指向同一个地址了
            j[0]=11; //改变了j 所指向对象的值,j仍然和main中的j指向同一个地址,且修改了这个地址中对象的值
            sb.append("fghij");// 同上
      

  5.   

    System.out.println("i=="+i);//为什么i的值是5而不是7?
    --------------------------------------------------
    这个没有问题打印的是main中定义的i,a()中只是修改了形参,不影响实参.java是值传递的.调用static void a(int i,int j[], StringBuffer sb)的时候,
    实参 j[]={1,2,3,4}和形参指向了同一个地址!对形参的修改影响到了实参.
    所以 "System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1"也没有问题.
      

  6.   

    说的清楚点:
    首先,java是以传值方式传递参数的,所以传i时实际是传的i的一个拷贝,对这个拷贝的修改并不影响原i的值
    而当你传对象的引用时,传进去的也是那个引用的拷贝,但拷贝和原来的引用都指向同一个内存地址,即同一个对象,所以你在方法中当然会修改掉以前的那个数组。因为数组也是对象,它是存在堆中的,而不象基本数据类型一样在栈里
      

  7.   

    同意
    cat_871017(零下九度)的解释,
    应该把他运行时 内存 的分配画个图;
    理解就容易一些