很多Java初学者,对于值传递和引用传递分的不是很清,最普遍的错误**
Java中的引用类型传参就是引用传递,对于Java中只有值传递(拷贝一份)**很是困惑。最近刚好有初学Java的同学问过我这个问题,所以把知识罗列了下,通过简单的Java代码加通俗易懂的话语,可以帮助看到的求学者,如有错误望大佬指正。
很多博客上讲的不是很清楚,看完大家就会知道为什么只有值传递了。
建议:有堆栈的基础知识,这样可以加深自己的理解。
话不多说,先上代码(普通类型参数和引用类型参数各一个),对这两个已经清楚的可以直接跳到最后的核心。
普通类型作为参数
普通类型传递,a的数值不会变化
public static void main(String[] args) {
int i = 10;
pass(i);
System.out.println("main i is "+i);
}
private static void pass(int i) {
i = 20;
System.out.println("pass i is "+i);
}
pass i is 20
main i is 10
引用类型作为参数
引用类型传递,a的数值会变化
public static void main(String[] arg){
people a = new people(10);
pass(a);
System.out.println("main a.age is "+a.getAge());
}
//普通类型,a,b的数值不会进行交换
private static void pass(people a){
a.setAge(20);
System.out.println("pass a.age is "+a.getAge());
}
pass a.age is 20
main a.age is 20
接下来是本次最重重重要的知识
为什么说java只有值传递
先来看段代码
public static void main(String[] arg){
people a = new people(10);
people b = new people(20);
swift(a,b);
System.out.println("a的值:" + a +"b的值:" + b);
}
private static void swift(people a, people b){
people c = a;
a = b;
b = c;
}
a,b没有进行转换
a的值:people [age=10]
b的值:people [age=20]
如果Java对对象采用的是按引用传递,那么这个方法就应该能够实现交换数据的效果。可是,结果显示没有。swift方法的a,b被初始化为两个对象的拷贝,这个方法交换的是这两个的拷贝。方法结束时参数变量a,b就会被丢弃。原来的变量仍然指向之前的空间。
科普:c++有值传递和引用传递。引用参数标有&符号。
swap(int a, int b)为值传递
swap(int& a,int& b)为引用传递