文章目录
- Java 值传递
- 基本类型参数的传递
- 引用类型参数的传递1
- 引用类型参数的传递2
- 问什么不引入引用传值呢?
Java 值传递
Java 中的值传递主要使用的参数有形参和实参
实参定义的参数,已经实际存在可以直接拿来使用
形参指的是在使用函数时需要传递进函数的参数,用于接收实参,没有确定的值
在 Java 中只有值传递,没有引用传递。
值传递方法接收到的是实际的值,引用传递是方法接收到的是实参所引用的对象在堆中的地址,对形参的修改将影响实参。
举例
String hello = "Hello!";
// hello 为实参
sayHello(hello);
// str 为形参
void sayHello(String str) {System.out.println(str);
}
基本类型参数的传递
先看下面一段代码
public static void main(String[] args) {int num1 = 10;int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) {int temp = a;a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); } **输出** a = 20 b = 10 num1 = 10 num2 = 20
这段代码表现的是一个基本类型参数的传值,在
swap
方法中,虽然对方法内两个数字进行了交换,但是并不会影响到num1、num2
,因为方法内部的两个值只是从传来的实参中复制进来的,也就相当于实参的副本,副本内容无论怎么修改并不会影响其本身的内容。
引用类型参数的传递1
再看一段代码
public static void main(String[] args) {int[] arr = { 1, 2, 3, 4, 5 };System.out.println(arr[0]);change(arr);System.out.println(arr[0]);}public static void change(int[] array) {// 将数组的第一个元素变为0array[0] = 0;}**输出**10
从这段代码可以看出,数组中的值发生了改变,实际上传递的还是数组的值,只不过这个值是实参的地址,也就是传递进来的数组对象和实参对象指向的都是同一个数组对象,这就可以说明为什么方法内部修改会影响到实参。
引用类型参数的传递2
再看一段代码
public class Person {private String name;// 省略构造函数、Getter&Setter方法 } public static void main(String[] args) {Person xiaoZhang = new Person("小张");Person xiaoLi = new Person("小李"); swap(xiaoZhang, xiaoLi); System.out.println("xiaoZhang:" + xiaoZhang.getName()); System.out.println("xiaoLi:" + xiaoLi.getName()); } public static void swap(Person person1, Person person2) {Person temp = person1;person1 = person2; person2 = temp; System.out.println("person1:" + person1.getName()); System.out.println("person2:" + person2.getName()); } **输出** person1:小李 person2:小张 xiaoZhang:小张 xiaoLi:小李
在这段代码中可以看出,swap 方法的参数 person1 和 person2 只是拷贝的实参 xiaoZhang 和 xiaoLi 的地址。
因此, person1 和 person2 的互换只是拷贝的两个地址的互换罢了,并不会影响到实参 xiaoZhang 和 xiaoLi 。
问什么不引入引用传值呢?
出于安全考虑,方法内部对的操作,对于调用者都是未知的