Java 值传递、引用传递
2023-12-13 06:13:26
????
开始之前,我们先来搞懂下面这两个概念:
- 形参&实参
- 值传递&引用传递
方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为:
- 实参(实际参数,Arguments):用于传递给函数/方法的参数,必须有确定的值。
- 形参(形式参数,Parameters):用于定义函数/方法,接收实参,不需要有确定的值。
String hello = "Hello!";
// hello 为实参
sayHello(hello);
// str 为形参
void sayHello(String str) {
System.out.println(str);
}
?
值传递、引用传递
????????程序设计语言将实参传递给方法(或函数)的方式分为两种:
- 值传递:方法接收的是实参值的拷贝,会创建副本。
- 引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。
????????很多程序设计语言(比如 C++、 Pascal )提供了两种参数传递的方式,不过,在 Java 中只有值传递。
?????????在Java中,参数传递是通过值传递(pass-by-value)进行的。这意味着当你将一个变量作为参数传递给一个方法时,实际上传递的是该变量的值的副本,而不是变量本身。
????????对于基本数据类型(如int、float、boolean等),它们被存储在栈内存中,当你将一个基本数据类型作为参数传递给一个方法时,传递的是该值的副本,方法中的修改不会影响原始的变量。
示例:
public class Main {
public static void main(String[] args) {
int x = 10;
modifyValue(x);
System.out.println(x); // 输出: 10
}
public static void modifyValue(int value) {
value = 20;
}
}
????????对于引用类型(如数组、对象等),变量存储的是对象在堆内存中的引用地址。当你将一个引用类型作为参数传递给一个方法时,传递的是引用的副本,但这两个引用仍指向同一个对象,因此方法中的修改会影响到原始的对象。
示例:
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modifyArray(arr);
System.out.println(Arrays.toString(arr)); // 输出: [4, 5, 6]
Person person = new Person("Alice");
modifyPerson(person);
System.out.println(person.getName()); // 输出: Bob
}
public static void modifyArray(int[] array) {
array[0] = 4;
array[1] = 5;
array[2] = 6;
}
public static void modifyPerson(Person p) {
p.setName("Bob");
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
????????在上述示例中,方法modifyArray
和modifyPerson
分别修改了传递进来的数组和对象的属性,这些修改会反映在原始的变量上。
????????因此,尽管Java中的参数传递是通过值传递进行的,但对于引用类型,实际上是通过传递引用的副本来操作同一个对象。这常常被称为"引用传递",但严格来说它仍然是值传递的一种形式。
更多消息资讯,请访问昂焱数据。
文章来源:https://blog.csdn.net/tszc95/article/details/134961297
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!