Java Pass by Value

2025年3月29日 | 阅读 4 分钟

人们通常将按值传递和按引用传递这两个术语放在一起讨论。在面试中,人们经常问“Java 是按值传递还是按引用传递,还是两者都是?”,这确实令人困惑。所以这个问题的答案是,Java 严格来说是按值传递。Java 中没有按引用传递。

让我们来了解一下传递参数给函数的几种不同机制

  • 引用
  • 结果
  • 值-结果
  • name

如今,最常用和最常见的两种机制是按值传递和按引用传递。让我们来讨论一下

按值传递:在按值传递的概念中,方法是通过传递一个值来调用的。因此,它被称为按值传递。它不会影响原始参数。

按引用传递:在按引用传递的概念中,方法是通过实际参数的别名或引用来调用的。因此,它被称为按引用传递。它将对象的唯一标识符转发给方法。如果我们更改了参数的实例成员,它将影响原始值。

Java 不支持按引用传递的概念。

关于在 Java 中传递的参数

现代编程语言中传递参数的基本概念是按值传递和按引用传递。但是,在 Java 中,按引用传递的概念被弱化了。它只支持按值传递的概念。

原始变量保存实际值,而非原始变量保存引用变量。但是,两个变量都使用栈内存来存储值。更多关于 Java 数据类型 的信息。

在 Java 中,在方法调用期间,会创建每个参数的副本,然后将其传递给方法。

对于原始数据类型,它会复制栈内存中的值,然后将其传递给方法。对于非原始数据类型,它会指向栈内存中指向堆中实际数据的引用。当我们传递一个对象时,它会从栈内存中复制一个引用并将其传递给被调用方法。

让我们通过一些例子来演示一下

创建一个具有对象和方法的 Bike 类。

Bike.java

现在,创建一个 TestSpeed 类来交换变量

TestSpeed.java

输出

Apache's Speed is =180.0
Pulsar's Speed is =200.0
Pulsar's Speed is =200.0

从上面的输出中,我们可以看到 swap 方法不起作用。它不起作用是因为 Java 是按值传递的,而在这里,我们传递的是对象的引用。所以很清楚,Java 不支持按引用传递。

解释:在上面的程序中,当我们使用 new 运算符创建一个 Bike 类的实例时,会创建一个类实例,并且变量保存着对象存储所在内存的引用。

在调用 swap() 方法时,我们创建了两个新变量 o1 和 o2,它们指向 apache 和 pulsar 变量的内存位置。下面是上面程序中 swap 方法的实现

正如我们可以从上面的代码片段中看到的,o1 和 o2 的值被改变了。它们是 apache 和 pulsar 引用位置的副本。因此,它们没有改变输出中 apache 和 pulsar 的值。

Java 按值传递示例

通过值传递参数不会影响原始变量。下面是按值传递的示例

PBVDemo.java

输出

 Value (before change)= 100
 Value (after change)= 100

从上面的输出中,我们可以看到原始值不受按值传递机制的影响。

另请参阅 Java 中的按值调用和按引用调用