对于java中方法传参的理解一直有些疑惑,今天写了个测试程序整理了下思路。
import javax.swing.text.ChangedCharSetException;
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
int a = 3;
System.out.println("first a:"+a);
change(a);
System.out.println("final a:"+a);
A ao = new A();
ao.a = 3;
System.out.println("first ao:"+ao.a);
change(ao);
System.out.println("final ao:"+ao.a);
Integer aI = 3;
System.out.println("first a:"+aI);
changeO(aI);
System.out.println("final a:"+aI);
A aO = new A();
aO.a = 3;
System.out.println("first aO:"+aO.a);
changeO(aO);
System.out.println("final aO:"+aO.a);
}
private static void change(int i){
i = 5;
}
private static void changeO(Integer i){
i = 5;
}
private static void change(A i){
i.a = 5;
}
private static void changeO(A i){
i = new A();
i.a = 5;
}
static class A{
int a;
}
}
输出结果:
first a:3
final a:3
first ao:3
final ao:5
first a:3
final a:3
first aO:3
final aO:3
java分为传值和传引用两种传参方式,概念太多容易混淆理解。
根本原因是java对基本类型和实体类在内存中存储方式不同,导致传参处理也不相同。基本类型和对象引用是放在栈中,而对象的成员变量则存放在堆里。