在 Java 中数组是以值传递还是以引用传递

您所在的位置:网站首页 java中的数组是对象吗为什么 在 Java 中数组是以值传递还是以引用传递

在 Java 中数组是以值传递还是以引用传递

2024-05-22 17:49| 来源: 网络整理| 查看: 265

什么是 Java 中的按值传递 什么是 Java 中的按引用传递

本教程介绍了在 Java 中按值或引用传递的数组。

当我们调用一个方法时,它的参数可以作为值或引用传递。在讨论这两个问题之前,让我们先了解两个术语:

callee:这是另一个方法调用的方法 caller:这是调用另一个方法的方法

现在让我们了解什么是按值传递和按引用传递。

什么是 Java 中的按值传递

当我们说参数是按值传递时,实际参数的值在内存中被复制了。

调用者和被调用者维护两个具有相同值的自变量。如果被调用者修改了参数值,我们看不到调用者的变化。

要点:

被调用者无权访问调用代码中的原始元素。 将数据(参数值)的副本发送给被调用者。 对传递变量的更改不会影响最终值。 什么是 Java 中的按引用传递

当我们说参数通过引用传递(也称为按地址传递)时,它意味着将调用函数中的参数的引用传递给相应的形参。

在这种情况下,会制作实际参数地址的副本。调用者和被调用者对参数使用相同的变量,因此,如果被调用者修改参数变量,我们可以看到调用者变量的变化。

要点:

被调用者引用调用代码中的编程元素。 传递存储数据的内存地址而不是值。 对值的任何更改都会影响原始数据 Java 是按值传递的

与 C++ 不同,在 Java 中,我们只能将参数作为值传递。但是有一个问题:当对象作为参数传递时,它们的引用作为值传递给被调用者。

换句话说,即使 Java 严格按值传递,它的行为与对象的引用传递一样。让我们用一些例子来更好地理解这个概念。

在 Java 中传递原始数据类型

在下面的代码中,我们将两个整数作为参数传递给函数,然后我们更改它们的值。

由于在 Java 中参数是按值传递的,因此该函数维护了一个单独的参数副本。我们对参数所做的任何更改都只在函数副本中进行,而不是在主函数(调用者)维护的副本中。

因此,我们在函数调用完成后打印值时得到原始值。看下面的示例代码:

public class SimpleTesting { static void JE_function(int n1, int n2) { n1 = -232; n2 = -90; } public static void main(String args[]) { int JE_numa = 6932; int JE_numb = 8934; System.out.println("Numbers before function call :" + JE_numa + " and " + JE_numb); JE_function(JE_numa, JE_numb); System.out.println("Numbers after the JE_function call :" + JE_numa + " and " + JE_numb); } }

输出:

Numbers before function call:6932 and 8934 Numbers after the JE_function call:6932 and 8934 在 Java 中传递数组

当涉及到对象时,对对象的引用是通过值作为参数传递的。

在下面的代码中,我们传递一个数组作为参数,当我们打印对象(数组)的值时,会打印一个内存位置。这与对象变量存储存储对象的内存位置有关。

看下面的示例代码:

public class SimpleTesting { static void JE_function(String[] sentence) { System.out.println(sentence); } public static void main(String args[]) { String[] sent = {"I", "Love", "Delftstack"}; JE_function(sent); } }

输出:

[Ljava.lang.String;@442d9b6e

使用上面的代码,我们尝试传达对作为参数传递的数组的引用。因此,如果我们更改数组的值(不是内存位置),更改将反映在被调用方中。

看下面的示例代码:

public class SimpleTesting { static void JE_function(String[] sentence) { sentence[1] = "Visit"; } public static void main(String args[]) { String[] sent = {"I", "Love", "Delftstack"}; System.out.println("Sentence before calling the function"); for (String word : sent) { System.out.println(word); } JE_function(sent); System.out.println("Sentence after calling the function"); for (String word : sent) { System.out.println(word); } } }

输出:

Sentence before calling the function I Love Delftstack Sentence after calling the function I Visit Delftstack

从上面的代码可以看出,对数组的任何更改都会反映在主块中。

把它想象成两个朋友正在做一个项目。朋友所做的任何工作都会反映在整个项目中。

在这种情况下,该函数引用主块使用的相同数组。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3