Java的值传递与“引用传递”

版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/LMD802/article/details/83933856

Java中的参数传递都是值传递

首先java中是没有引用传递的。

  • 形参与实参的概念
    • 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来
      接收调用该函数时传入的参数。
    • 实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递
      关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为
      “实际参数”。
  • 值传递与引用传递
    • 值传递(passby value)是指在调用函数时将实际参数复制一份传递
      到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参
      数。

    • 引用传递(passby reference)是指在调用函数时将实际参数的地址
      直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实
      际参数,学过C或者C++的应该更加了解引用传递。

    • 错误理解

      • 1、值传递和引用传递,区分的条件是传递的内容,如果是
        个值,就是值传递。如果是个引用,就是引用传递。
      • 2、Java中you引用传递。
      • 3、传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

1、对基本数据类型:

public class Demo1 {
	public static void main(String[] args) {
		Demo1 demo1 = new Demo1();
		int i = 3;
		demo1.change(i);
		System.out.println("i在main函数中" + i);
	}
	public void change(int i){
		i = 4;
		System.out.println("i在change函数中" + i);
	}
}
结果为:
i在change函数中4
i在main函数中3

change:方法内部对name的值的修改并没有改变实际参数i的值。那么,按照上面的定义,可得到结论:Java的基本数据类型传递是值传递。

2、对引用数据类型:

public class Demo2 {
	public static void main(String[] args) {
		Demo2 demo = new Demo2();
		User guYue = new User();
		guYue.setAge(18);
		guYue.setName("古月");
		demo.change(guYue);
		
System.out.println("guYue在main函数中" + 		guYue);
	}
	public void change(User guYue){
		
		guYue.setAge(20);
		guYue.setName("古月哥欠");
		
		System.out.println("guYue在change函数中		" + guYue);
	}
}
结果为:
guYue在change函数中User [name=古月哥欠,age=20]
guYue在main函数中User [name=古月哥欠, age=20]

经过change方法执行后,实参的值被改变了,那按照上面的引用传递的定义,实际参数的值被改变了,这就是引用传递了。有人便得出一个新的结论:Java的方法中,在传递基本数据类型的时候是值传递,在传递对象类型的时候是引用传递。但是,这种表述仍然是错误的。可以再看以下代码

public class Demo2 {

	public static void main(String[] args) {
		Demo2 demo = new Demo2();
		
		User guYue = new User();
		guYue.setAge(18);
		guYue.setName("古月");
		demo.change(guYue);
		
		System.out.println("guYue在main函数中" + guYue);
	}
	
	public void change(User guYue){
		guYue = new User();
		guYue.setAge(20);
		guYue.setName("古月哥欠");
		
		System.out.println("guYue在change函数中" + guYue);
	}
}
结果为:
guYue在change函数中User [name=古月哥欠, age=20]
guYue在main函数中User [name=古月, age=18]
change方法执行过后main函数里的值却没发生改变,如果是引用
传递的话通过:user = new Uer();引用会指向新的地址,
那么原对象肯定会发生改变,但却没发生改变,这说明传递对象
类型时并不是引用传递。可是上个会发生了改变,是因为这里是
把实际参数的引用的地址复制了一份,传递给了形式参数。所以
上面的参数其实是值传递,把实参对象引用的地址当做值传递给
了形式参数。

猜你喜欢

转载自blog.csdn.net/LMD802/article/details/83933856