1.概述
引用类型中,java中全部都是值传递,传递对象里的值,而不会传递对象本身。
2.代码示例
public class Main {
public static void main(String[] args) {
Student a = new Student();
Student b = new Student();
a.setName("zhangsan");
b.setName("lisi");
System.out.println(a);
System.out.println(b);
swap1(a,b);
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println(a);
System.out.println(b);
int c =10;
int d=20;
Integer e =10;
Integer f=20;
swap(c,d);
System.out.println(c);
System.out.println(d);
swap(e,f);
System.out.println(e);
System.out.println(f);
}
private static void swap1(Student e, Student f) {
String name = e.getName();
e.setName(f.getName());
f.setName(name);
}
private static void swap(Student e, Student f) {
Student a= e;
e=f;
f=a;
}
private static void swap(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
}
输出
Student{name='zhangsan', School='null'}
Student{name='lisi', School='null'}
Student{name='lisi', School='null'}
Student{name='zhangsan', School='null'}
Student{name='lisi', School='null'}
Student{name='zhangsan', School='null'}
10
20
10
20
3.代码逻辑
初始化状态:(左边栈,右边堆)
swap1方法执行:
出栈前:
由于新调用了swap方法,所以在栈中引入了新栈针,记作a’,b',为方法参数。a'为a的值,b'为b的值。方法执行完后,e、f、name属性出栈,a.getName()、b.getName()值发生改变。
swap方法执行:
初始化状态:
出栈:
a‘指向的是e这个对象,也就是a指向的对象,当e和f指向的对象交换时,并不影响a和b,方法执行完后,a‘、e、f出栈,a和b仍然指向之前的对象,所以a和b不会改变。
整型int的swap方法调用:
int类型的数据是整型值,所以直接在栈里分配。
同理 调用新方法、引入栈针,再声明方法参数c‘、d‘。
调用完方法后,c‘、d‘会出栈,并不会对原始的c、d值产生影响,所以值不变。