什么是值传递什么是引用传递?(Java是值传递)
理解值传递(Pass by Value)和引用传递(Pass by Reference)是编程中非常重要的概念,它们涉及如何将数据传递给函数或方法。这两种传递方式有不同的行为,会影响到函数内部对参数的修改是否会影响原始数据。
值传递(Pass by Value):
- 值传递意味着将实际参数的拷贝传递给函数或方法。
- 在函数内部对参数的修改不会影响原始数据。
- 这是Java基本数据类型(如int、char、float等)的传递方式,以及大多数编程语言中的默认传递方式。
- 示例:Java中的基本数据类型作为参数传递给方法时就是值传递。
public static void change(int a, String b) {
a = 10;
b = "World";
}
public static void main(String[] args) {
int a = 0;
String b = "Hello";
change(a, b);
// 输出 0_Hello;
// 因为Java是值传递,方法中的形参是实参的拷贝,形参的改变不会影响实参的改变
System.out.println(a + "_" + b);
}
引用传递(Pass by Reference):
- 引用传递意味着将实际参数的引用或地址传递给函数或方法。
- 在函数内部对参数的修改会影响原始数据,因为它们指向相同的内存位置。
- 这是一些编程语言(如C++、C#、Python中的可变对象)中的传递方式,但不是Java的默认方式。
Java中只有值传递
在Java中,即使传递的是对象引用,也是值传递,但要注意,对象引用本身是拷贝传递,但对象的内容(即对象的状态)可以在函数内部被修改。这是因为对象引用指向对象的内存地址,但不会改变引用本身。
class MyClass {
int value;
MyClass(int value) {
this.value = value;
}
}
public void modifyObjectReference(MyClass obj) {
obj = new MyClass(10); // 这不会改变原始对象引用的指向
}
public void modifyObjectState(MyClass obj) {
obj.value = 10; // 这会改变原始对象的状态
}
public static void main(String[] args) {
MyClass myObj = new MyClass(5);
modifyObjectReference(myObj);
System.out.println(myObj.value); // 输出 5,对象引用的指向未改变
modifyObjectState(myObj);
System.out.println(myObj.value); // 输出 10,对象的状态被修改
}
简单总结
在Java中只有值传递,即便传递的是对象,也是值传递;对象引用的值传递实际上就是拷贝出一个变量和对象指向相同的引用,如果改变拷贝变量的引用,不会影响原来对象的引用;但是如果拷贝出来的变量改变了引用中的某个状态,那么实际上就是改变了原有对象引用的内容,所以原有对象的引用的内容也会跟着改变