转自: http://www.cnblogs.com/yujun19880729/p/3515490.html
基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress
引用类型包括:类类型,接口类型和数组。
public class TestValTran {
public static void main(String[] args) {
TestValTran testValTran = new TestValTran();
int i = 1;
int j = 2;
testValTran.swap1(i, j);
System.out.println("i = " + i + ", j = " + j);
User user = new User(1, 2);
testValTran.swap2(user);
System.out.println("user.i = " + user.getI() + ", user.j = " + user.getJ());
User user1 = new User(1, 2);
testValTran.swap3(user1);
System.out.println("user1.i = " + user1.getI() + ", user1.j = " + user1.getJ());
}
/***
* 基本的数据类型,对应每个方法所对应的栈幁都有自己的局部变量表。也就是会自己创建一个基本数据类型的对象,不会对真实的对象产生影响
*
* @param a
* @param b
*/
public void swap1(int a, int b) {
int temp = b;
b = a;
a = temp;
}
/**
* 这种方式对user不会发生变化,只是把局部变量user先传递为外部user的引用,然后又重新重新赋值为temp的引用。没有对外部user引用的真实对象进行操作。所以不会生效
*
* @param user
*/
public void swap2(User user) {
User temp = new User(2, 1);
user = temp;
}
/**
* 这种传递了对象的引用之后,又获取了引用的对象,进行了修改,所以能生效
*
* @param user
*/
public void swap3(User user) {
int temp = user.getJ();
user.setJ(user.getI());
user.setI(temp);
}
}
public class User {
int i, j;
public User(int i, int j){
this.i=i;
this.j=j;
}
public int getI(){
return i;
}
public int getJ(){
return j;
}
public void setI(int i) {
this.i = i;
}
public void setJ(int j) {
this.j = j;
}
}
运行结果:
i = 1, j = 2
user.i = 1, user.j = 2
user1.i = 2, user1.j = 1