Java是值传递还是引用传递

Java是值传递还是引用传递

java中无论是基本类型还是引用类型,都是值传递:

  • 对于基本类型而言,传递的是具体的值----------是在赋值
  • 对于引用类型而言,传递的是具体的地址值----是在指向一个对象

举例说明:

基本类型:

int a = 2;
int b = a;
System.out.println("a的值为:"+a);  //a的值为:2
System.out.println("b的值为:"+b);  //b的值为:2

由于方法中的局部变量是保存在栈中的,此时内存如图所示:
请添加图片描述
更改a的值,进行查看:

a = 333;
System.out.println("a的值为:"+a);  //a的值为:333
System.out.println("b的值为:"+b);  //b的值为:2

修改a的值,对b的值没有影响。

内存图如下:
请添加图片描述所以可以得出结论,基本类型的等号相当于是在赋值,传递的是具体的值。

引用类型

class Student{
	String name;
	int age;
	public void study(){
	 	System.out.println("学习!");
}
public class Test{
	public static void main(String[] args) {
		Student s = new Student();
		Student s1 = s;
	}
}

此时内存图为:
请添加图片描述可以观察到,引用类型变量中存储的是地址值。在赋值操作中,传递的也是地址值。换句话说,这两个变量指向同一个对象。
当更改该对象下的实例变量的值时,两个变量所存储的地址值不会发生改变,但实例变量的值均变。

public class Test{
	public static void main(String[] args) {
		Student s = new Student();
		Student s1 = s;
		System.out.println(s.age);  //0
		System.out.println(s1.age); //0
		s.age = 25;
		System.out.println(s.age);  //25
		System.out.println(s1.age); //25
	}
}

内存图如下:
请添加图片描述下面举个例子来加深印象:

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        int[] arr = new int[]{1,2,3};
        test.change(arr);
        System.out.println(arr[0]); //666
    }
    public void change(int[] arr){
        arr[0] = 666;
    }
}

该程序输出结果为666。
当做出修改后,大家可以猜测一下结果:
请添加图片描述
此时的输出值实际上仍然为666。
内存图如下:
请添加图片描述实际上test.change(arr)相当于int[] a = arr,即将arr的地址值赋值给change方法中的参数a,意味着arr和a指向了同一个对象,所以改值后两者都会变。

浅显结论,欢迎讨论!


版权声明:本文为L12131415L原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。