美文网首页
Java中的按值调用和按引用调用

Java中的按值调用和按引用调用

作者: 好想吃汉堡 | 来源:发表于2022-04-27 13:13 被阅读0次

为什么按值调用和按引用调用?

方法或函数可以通过两种方式调用。一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它们的值的类型来区分。

在我们开始之前,让我澄清一件事,在Java中, 只有按值调用(值传递),没有按引用调用 。

按值调用

按值调用是一种方法,通过复制给定变量(或常量或任何保存数据的对象)的实际值,将参数传递给函数

这意味着当我们调用一个传递参数值的方法时,这个参数值会被复制到内存的一部分(取决于类型),值的副本会被传递给调用方法的参数。

在Java中,只有按值调用,没有按引用调用。

引用调用

通过引用调用是一种将值的引用(即地址)传递给方法的方法。

这意味着,当我们通过将引用的副本(即地址)传递给该方法的值而不是值本身的副本来调用该方法时,调用方法具有该值的引用(即地址)。

当调用方法更改值的引用时,原始引用也会更改。

为什么Java中只有按值调用,没有按引用调用?

根据定义,引用调用是我们传递该变量的引用(即地址)的地方。要做到这一点,我们需要首先存储地址,这将需要一个指针(在C中,其传递为*variableName)。正如我们所知,在java中,我们没有指针,因此不可能传递引用(即地址)并执行逐引用调用。

Java不支持指针,这就是为什么Java不支持引用调用。但是C/C++支持指针,因此这些语言支持引用调用。

您可能会问,为什么Java不支持指针?好吧,这是另一个有争议的话题,我们可以在其他文章中讨论,直到签出这个stackoverflow页面( https://stackoverflow.com/questions/5298421/why-doesnt-java-support-pass-by-reference-like-c ),这让您对它有了一些了解。

但是,我们仍然可以借助对象行为在Java中实现引用调用。

Java中的引用调用,但如何调用?

Java总是使用按值调用。这意味着该方法获取所有参数值的副本,并且该方法不能修改传递的变量的内容。Java使用两种方法参数:

Java基本类型

Java对象引用

它看起来非常简单明了,就像将基本类型传递给方法一样。但在将对象传递给该方法时,这是非常引人注目的。当一个对象被传递给一个方法时,该方法会获得对象引用的一个副本,而原始副本和正式副本都引用同一个对象,因此在调用方法中,可以更改对象参数的状态。

让我们通过一个例子来详细了解上述两个方法参数。

将Java基本数据类型作为参数传递给方法

对于原始数据类型参数,原始值不变。让我们举一个简单的例子:

publicclassPrimitiveDataInAction{publicstaticvoidmain(String[] args){intsomeValue =50;    System.out.println("Before method call :: "+ someValue);        modified(someValue);        System.out.println("After method call :: "+ someValue);  }publicstaticvoidmodified(intsomeValue){    System.out.println("exiting name :: "+ someValue);// modifying the parametersomeValue =15;    System.out.println("modified name :: "+ someValue);  }}

输出:

Before method call ::50exiting name ::50modified name ::15After method call ::50Process finished withexitcode0

当您将原始数据类型变量传递给一个方法时,它会为该方法创建一个本地副本,并执行方法中提到的任何操作&一旦这个变量从这个方法中出来,方法本地副本就会从内存中删除

& 调用该变量之前加载的前一个值。

Java对象引用

对于Java对象引用类型的按值调用,会更改原始值。让我们举一个简单的例子:

classJavaObjectReferencesInAction{publicstaticvoidmain(String[] args){    List listOfString =newArrayList < > ();    listOfString.add("Mahesh");    System.out.println("Before modified :: "+ listOfString);    modified(listOfString);    System.out.println("After modified :: "+ listOfString);  }publicstaticvoidmodified(List < String > listOfString){// modifying the stringlistOfString.add("Imran");  }}

输出:

Before modified :: [Mahesh]exiting listOfString :: [Mahesh]modified listOfString :: [Mahesh, Imran]After modified :: [Mahesh, Imran]Process finished withexitcode0

让我们看看它是如何工作的。

在上面的示例中,我们创建了一个 ArrayList 对象,并在其中添加了一个字符串值 Mahesh 。现在列表中的数据是一个字符串,值为 Mahesh 。

在下一行中,我们调用了 modified 方法,该方法获取一个列表,并向同一给定列表中添加一个字符串Imran

但是当我们调用这个修改过的方法时,Java对象引用代替了值。它传递list的引用,list只是list的实际对象

这也会导致修改原始列表。

结论

我们详细讨论了一个棘手的面试问题,即Java中的按值调用和按引用调用。对于初学者来说,这可能需要消化很多东西,但相信我,一旦你开始玩它,它就会在你的脑海中清晰地浮现出来。

相关文章

  • Java中的按值调用和按引用调用

    为什么按值调用和按引用调用? 方法或函数可以通过两种方式调用。一种是按值调用,另一种是按引用调用,这两种方式通常根...

  • Java核心技术(卷I) 5、Java值传递

    1、按值调用和按引用调用 按值调用:方法接收的是调用者提供的值 按引用调用:方法接收调用者提供的变量地址 方法可以...

  • Java 参数的传递

    Java 的参数是值传递,不是引用传递 Java 中只有值传递,方法按值调用(call by value)。也就是...

  • Java调用方法时值传递的理解

    Java中方法调用时,没有按引用传递这个说法,只有按值传递。基本类型数据的传递和引用类型数据的传递,根本上都是按值...

  • P问题简答

    Q-27:Python中的“按值调用”是什么? Q-28:什么是Python中的“按引用调用”? Q-29:mat...

  • 01-Java程序设计语言是按值调用还是按引用调用?

    01-Java程序设计语言是按值调用还是按引用调用? 在写代码过程中,我们经常会将基本类型作为参数传递给一个方法;...

  • 按值传递、按引用传递、按共享传递

    按值传递、按引用传递、按共享传递 按值传递(call by value) 按值传递,就是指在调用函数时,将实参对应...

  • java 3

    方法参数 按值调用:表示方法接收的是调用者提供的值。 按引用调用:表示方法接收的是调用者提供的变量地址。 一个方法...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • 按值传递和按引用传递

    按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实...

网友评论

      本文标题:Java中的按值调用和按引用调用

      本文链接:https://www.haomeiwen.com/subject/fjzkyrtx.html