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

 更新时间:2022年04月27日 11:03:53   作者: sofia  
这篇文章主要介绍了Java中的按值调用和按引用调用,一种是按值调用,另一种是按引用调用,这两种方式通常根据作为输入或参数传递给它们的值的类型来区分,下文相关的更多详细资料感兴趣的小伙伴可以参考一下

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

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

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

二、按值调用

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

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

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

三、引用调用

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

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

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

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

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

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

您可能会问,为什么Java不支持指针?好吧,这是另一个有争议的话题,我们可以在其他文章中讨论,直到签出这个stackoverflow页面,可以参考,这让您对它有了一些了解。

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

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

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

  • Java基本类型
  • Java对象引用

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

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

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

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

public class PrimitiveDataInAction {
  public static void main(String[] args) {
    int someValue = 50;
    System.out.println("Before method call :: " + someValue);
    modified(someValue);
    System.out.println("After method call :: " + someValue);
  }
  public static void modified(int someValue) {
    System.out.println("exiting name :: " + someValue);
    // modifying the parameter
    someValue = 15;
    System.out.println("modified name :: " + someValue);
  }
}

输出:

Before method call :: 50
exiting name :: 50
modified name :: 15
After method call :: 50

Process finished with exit code 0

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

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

六、Java对象引用

对于Java对象引用类型的按值调用,会更改原始值。

让我们举一个简单的例子:

class JavaObjectReferencesInAction {
  public static void main(String[] args) {
    List <String> listOfString = new ArrayList < > ();
    listOfString.add("Mahesh");
    System.out.println("Before modified :: " + listOfString);
    modified(listOfString);
    System.out.println("After modified :: " + listOfString);
  }
  public static void modified(List < String > listOfString) {
    // modifying the string
    listOfString.add("Imran");
  }
}

输出:

Before modified :: [Mahesh]
exiting listOfString :: [Mahesh]
modified listOfString :: [Mahesh, Imran]
After modified :: [Mahesh, Imran]

Process finished with exit code 0

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

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

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

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

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

七、结论

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

相关文章

  • Java 实战练手项目之医院预约挂号系统的实现流程

    Java 实战练手项目之医院预约挂号系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SpringBoot+Maven+Vue+mysql实现一个医院预约挂号系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • SpringBoot + MyBatis-Plus构建树形结构的几种方式

    SpringBoot + MyBatis-Plus构建树形结构的几种方式

    在实际开发中,很多数据都是树形结构,本文主要介绍了SpringBoot + MyBatis-Plus构建树形结构的几种方式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • java  文件锁的简单实现

    java 文件锁的简单实现

    这篇文章主要介绍了java 文件锁的简单实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • IDEA2022性能优化的一些设置技巧

    IDEA2022性能优化的一些设置技巧

    这篇文章主要介绍了IDEA2022性能优化的一些设置,需要的朋友可以参考下
    2022-08-08
  • java的NIO管道用法代码分享

    java的NIO管道用法代码分享

    这篇文章主要介绍了java的NIO管道用法代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 详解Spring Boot最核心的27个注解,你了解多少?

    详解Spring Boot最核心的27个注解,你了解多少?

    这篇文章主要介绍了详解Spring Boot最核心的27个注解,你了解多少?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java中static的用法及注意点

    java中static的用法及注意点

    在本篇文章里小编给大家整理的是一篇关于java中static的用法及注意点,有兴趣的朋友们可以学习下。
    2021-03-03
  • springmvc处理异步请求的示例

    springmvc处理异步请求的示例

    这篇文章主要介绍了springmvc处理异步请求的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • spring MVC实践需要注意的地方

    spring MVC实践需要注意的地方

    这篇文章主要介绍了spring MVC实践需要注意的地方,帮助大家更好的理解和学习使用spring MVC,感兴趣的朋友可以了解下
    2021-03-03
  • java多线程中的volatile和synchronized用法分析

    java多线程中的volatile和synchronized用法分析

    这篇文章主要介绍了java多线程中的volatile和synchronized用法分析,以实例的形式分析了在多线程中volatile和synchronized的用法区别与使用原理,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论