class test{
int a=1;
int b=2;

public void count1(int a,int b){

a=0;
b=0;
//System.out.println(a1+","+b1);

}
public void count2(test a){
a.a=0;
a.b=0;
}

public static void main(String[] args){

test t1=new test();
test t2=new test();
t1.count1(t1.a,t1.b);
System.out.println(t1.a+","+t1.b);//结果一
t2.count2(t2);
System.out.println(t2.a+","+t2.b);//结果二
}
}

解决方案 »

  1.   

    t1.count1(t1.a,t1.b);中传入t1.a=1,t1.b=2
    count1(int a,int b)作用域a,b只在这个函数里不能改变外层参数,所以外层System.out.println(t1.a+","+t1.b);仍是原来的值
    t2.count2(t2);传入类test的对象,改变了该对象中外层a,b所以System.out.println(t2.a+","+t2.b);出来的是改变后的值
      

  2.   

    结果一:
    1,2
    结果二:
    0,0第一次调用
    t1.count1(t1.a,t1.b);
    把 t1.a 和 t1.b 按值传进去,在内存里就是重新分配了两块空间,然后把t1.a 和 t1.b的值复制后放到这两块空间里,方法里只是对形参进行赋值,也就是对重新分配的两个空间里的值进行改变,而没有改变t1.a 和 t1.b第二次调用
    t2.count2(t2);
    传了一个对象,按引用传参,在内存里重新分配了两块空间,但是不是把t1.a 和 t1.b 的值存到这两块空间,而是把t1.a 和t1.b的内存地址存放在这两块空间,改变的时候当然就是改变t1.a 和t1.b 原来内存所存放的值,所以结果就是0,0
      

  3.   

    public void count1(int a,int b){

    a=0;
    b=0;
    //System.out.println(a1+","+b1);

    }
    中,a和b作为局部变量,在函数执行完毕后就会消失,因此test类中的成员变量a,b值没发生变化
    public void count2(test a){
    a.a=0;
    a.b=0;
    }
    这个方法函数是直接改变类的成员变量,输出时的值自然会改变