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指向了同一个对象,所以改值后两者都会变。
浅显结论,欢迎讨论!
上一篇:
IDEA上Java项目控制台中文乱码