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指向了同一个对象,所以改值后两者都会变。

浅显结论,欢迎讨论!

经验分享 程序员 微信小程序 职场和发展