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);//结果二
}
}
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);//结果二
}
}
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);出来的是改变后的值
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
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;
}
这个方法函数是直接改变类的成员变量,输出时的值自然会改变