值传递和引用传递
Posted xiaobo520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值传递和引用传递相关的知识,希望对你有一定的参考价值。
一:值传递和引用传递的区别
值传递:(形参是基本类型)方法调用时,实际参数把值传递给形式参数,形式参数会新辟一个内存单元,用实参的值初始化,两者是不同的内存单元,形参再次被赋值的话,是不会影响实参的。
引用传递:(形参是引用类型,为对象和数组,传的是地址),方法调用时,实参是对象或数组,传递给形参的是内存地址,两者指向的是同一个内存单元,形参改变了值的话,实参也会发生改变。
二:为什么说在java里面只有值传递
这句话的意思是值传递传递的是值的拷贝,引用传递传递的是引用地址,统称值传递
三:特殊情况的传值
先看一个特殊的例子,string是一个对象了吧,那么它是按照引用传递的喽。看下面代码的结果
public class Test{ public static void main(String[] args){ String str = "java"; change(str); System.out.println(str); } public static void change(String str){ str = "web"; System.out.println(str); } }
很明显,传递的string并没有改变实参的值,那么是为什么呢?下面我再举两个例子,注意区别!
1 public class A { 2 public int age; 3 4 public A(int age) { 5 this.age = age; 6 } 7 8 public int getAge() { 9 return age; 10 } 11 12 public void setAge(int age) { 13 this.age = age; 14 } 15 }
public class Test { public static void change(A a){ a.setAge(18); System.out.println(a.getAge()); } public static void main(String[] args) { A a = new A(22); change(a); System.out.println(a.getAge()); } }
咦,怎么这时候又可以形参改变实参了呢?别急,再看看下一个例子(A类不变)
1 public class Test { 2 public static void change(A a){ 3 a=new A(18); //主要这里发生变化 4 System.out.println(a.getAge()); 5 } 6 public static void main(String[] args) { 7 A a = new A(22); 8 change(a); 9 System.out.println(a.getAge()); 10 11 } 12 }
在change方法里面a对象指向了新的实例,也就是说形参指向的是0x8888(假设),而实参指向的还是原来的0x6666,两者引用的地址不一样了,所以并没有改变实参的引用地址,也没有改变引用地址所指向的值!
现在我们回到那个string,结果string的特殊性,我们不难想到,在方法里面,str=“web”,是新的对象,所以不同的引用地址,形参改变的值不会影响实参,只有两者指向地址相同才能改变。
以上是关于值传递和引用传递的主要内容,如果未能解决你的问题,请参考以下文章