Java 中的值传递和引用传递

2025 年 5 月 29 日 | 阅读 5 分钟

在 Java 中,传值引用传递都指的是参数如何传递给方法。

Java 中的传值

在 Java 中,当通过传递值作为参数来调用方法时,这被称为传值。通过 Java 的传值特性,会将变量的副本传递给方法。因此,在方法内所做的任何修改只会影响该方法,而不会影响主方法中的原始变量。

这是 Java 的引用传递和传值函数之间的主要区别。传递具有基本数据类型的变量被认为是传值;因此,对变量所做的任何修改都不会反映在调用者的作用域中。

要记住的重要事项

  • Java 总是使用传值,即使是对象也是如此。
  • 当将基本类型(如 int、double、float)传递给方法时,会创建一个该值的副本
  • 方法内的更改不会影响原始变量

传值示例

在传值的情况下,原始值不会改变。我们来看一个简单的例子

示例

编译并运行

输出

before change 50
after change 50

Java 中传值的另一个示例

在引用传递的情况下,如果我们修改被调用的方法,原始值就会被改变。当我们传递一个对象而不是基本值时,原始值将会被修改。在这个例子中,我们正在传递一个对象作为值。

示例

编译并运行

输出

before change 50
after change 150

Java 中的引用传递(对象引用)

在 Java 中,引用传递意味着将对象的引用(内存地址)按值传递给方法。尽管 Java 严格使用传值,但在将对象的引用传递给方法时,它会复制引用,然后再将其作为值传递。传值与引用传递在 Java 中最重要的区别在于,复制的引用也指向相同的地址,从而确保所有修改都能在主方法中反映出来。

要记住的重要事项

  • Java不支持真正的引用传递;它按值传递引用。
  • 当传递一个对象时,会创建一个引用的副本
  • 引用仍然指向同一个对象,因此方法内部的修改会影响原始对象。

引用传递示例

示例

编译并运行

输出

After the method call, value = 15

传值与引用传递之间的区别

特性传值调用传引用调用
定义将实际值的副本传递给方法。将引用的副本(地址)传递给方法。
Java 支持Java 对原始类型和对象都使用传值。Java 不支持真正的引用传递;相反,它按值传递引用。
对原始数据的影响在方法内对值的更改不会影响原始变量。在方法内对对象状态的更改会影响原始对象(但不会影响引用本身)。
适用于仅适用于原始类型(如 int、double、float 等)。仅适用于对象(类的实例)。
对象传递对象的引用的副本。对对象属性的更改会影响原始对象。不适用,因为 Java 不支持真正的引用传递。
原始类型示例如果传递一个 int,在方法内修改它不会影响原始的 int。不适用。
对象示例如果传递一个对象,修改它的字段会影响原始对象,但重新分配引用则不会。不适用。
内存消耗由于创建了变量的副本,因此需要更多内存。引用指向与原始对象相同的内存位置,因此不需要更多内存。
真正的引用传递?是的不能

Java 传值与引用传递选择题

1. 在 Java 中,原始数据类型是如何传递给方法的?

  1. 按引用
  2. 按值
  3. 按指针
  4. 按对象
 

答案:b)

解释:在 Java 中,原始数据类型通过值传递给方法,这意味着传递的是值的副本,并且在方法内对参数的修改不会影响原始变量。


2. 以下代码的结果是什么?

  1. 10
  2. 20
  3. 0
  4. 编译时错误
 

答案:a)

解释:变量 a 通过值传递给 modify 方法,因此 a 的原始值保持不变,输出为 10。


3. 对象在 Java 中是如何传递给方法的?

  1. 按引用
  2. 按引用的值
  3. 按对象副本
  4. 按内存地址
 

答案:b)

解释:Java 中的对象是通过引用的值传递的。这意味着引用会被复制,但原始引用和复制的引用都指向内存中的同一个对象。


4. 下列代码的输出是什么?

  1. 50
  2. 100
  3. 150
  4. 200
 

答案:c)

解释:change 方法修改了 Test 对象的 data 字段。由于对象引用按值传递并指向同一个对象,因此更改会反映在原始对象中,输出为 150。


5. 以下关于 Java 中传值和引用传递的陈述哪项是正确的?

  1. Java 支持对原始类型和对象都进行引用传递。
  2. Java 支持对原始类型进行传值,对对象进行引用传递。
  3. Java 支持对原始类型和对象都进行传值。
  4. Java 支持对原始类型进行引用传递,对对象进行传值。
 

答案:c)

解释:Java 对原始类型和对象都使用传值。对于对象,传递的是指向对象的引用的值,这使得方法可以修改对象的状态。


下一个主题strictfp 关键字