java中引用传递和值传递的理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中引用传递和值传递的理解相关的知识,希望对你有一定的参考价值。
按值调用(call by value):表示方法接收的是调用者提供的值
按引用调用(call by reference):表示方法接收的是调用者提供的地址
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值
理解:
对于java来说,是不存在引用调用的,它总是按值调用
如何理解红字?方法是得到所有参数值的一个拷贝,方法无法修改传递给它的任何变量值的内容
示例1:
public static void main(String[] args) { int temp = 0; int x = 10; int y = 11; System.out.println("before: " + x + " "+ y); // x = 10, y = 11 temp = y; y = x; x = temp; System.out.println("after: " + x + " "+ y); // x = 11, y = 10 }
实例2:
public static void main(String[] args) { int temp = 0; int x = 10; int y = 11; System.out.println("before: " + x + " "+ y); // x = 10, y = 11 change(x, y); System.out.println("after: " + x + " "+ y); // x = 10, y = 11 } public static void change(int x, int y) { int temp = 0; temp = y; y = x; x = temp; }
我们可以看到,一个方法不可以改变基本数据类型参数但是,却可以通过引用类型来改变参数:
示例:
public static void main(String[] args) { Test t1 = new Test("James", 15); plus(t1); System.out.println(t1.age); // 输出25 } public static void plus(Test t){ t.age += 10; } } class Test { String name; int age; public Test(String name, int age) { super(); this.name = name; this.age = age; }
最后,我们来试验一下引用类型是否可以对象交换:
示例:
public static void main(String[] args) { Test t1 = new Test("James", 15); Test t2 = new Test("Alice", 20); System.out.println(t1 + " " + t2); //t1 = [email protected], t2 = [email protected] swap(t1, t2); System.out.println(t1 + " " + t2); //t1 = [email protected], t2 = [email protected] } public static void swap(Test t1, Test t2) { Test temp = t1; t2 = t1; t1 = temp; } } class Test { String name; int age; public Test(String name, int age) { super(); this.name = name; this.age = age; } public Integer plus(Integer age){ age += 10; return age; }
依旧是无法实现的
总结:
- 一个方法不能修改基本数据类型的参数
- 一个方法无法修改对象参数的状态
- 对象参数可以通过对象引用来改变
以上是关于java中引用传递和值传递的理解的主要内容,如果未能解决你的问题,请参考以下文章