关于局部变量(易错)
在java中只有传值调用,没有传址调用。
直接看个案例:
- A()方法将a变量每次调用都加1;
- B()方法将b变量从小写b改成大写B;
- C()方法将c[0]从"c"改成"C";
public class Test3 {
@Test
public void test() {
int a = 0;
char b = 'b';
char[] c = {
'c'};
A(a);
B(b);
C(c);
System.out.println("a变量最终:" + a);
System.out.println("--------------------------------------------------------");
System.out.println("b变量最终:" + b);
System.out.println("--------------------------------------------------------");
System.out.println("c[0]变量最终:" + c[0]);
}
public void A(int a){
if(a != 2){
System.out.println("局部a:" + a);
a += 1;
A(a);
}
}
public void B(char b){
b = 'B';
System.out.println("局部b:" + b);
}
public void C(char[] c){
c[0] = 'C';
System.out.println("局部c:" + c[0]);
}
}
先来看看局部变量的变化:
可以发现局部变量a,b,c都能按要求变化。
再来看看成员变量的变化:
可以发现a,b变量并没有变化,这也印证了在java中只有传值调用,没有传址调用。
也就是说:
- 对于基本数据类型,实现的是传值,只是个形参,不会改变原有值。
- 对于引用数据类型,对这个引用进行操作,其实也是相当于对形参的操作,不会改变原来的引用。
- 但是,当对这个引用的属性进行操作的时候,相当于CPP中的传址调用,可以改变这个引用的属性的值。
总结
1、对于基本类型参数,在方法体内对参数进行重新赋值,并不会改变原有变量的值。
2、对于引用类型参数,在方法体内对参数进行重新赋予引用,并不会改变原有变量所持有的引用。
3、方法体内对参数进行运算,不影响原有变量的值。
4、方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。