iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java方法传参时采用哪种传递
  • 283
分享到

Java方法传参时采用哪种传递

2023-06-17 04:06:04 283人浏览 八月长安
摘要

这篇文章给大家介绍Java方法传参时采用哪种传递,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们来看一个新手甚至写了多年Java的朋友都可能不是十分确定的问题:在Java方法传参时,究竟是引用传递还是值传递?为了说明

这篇文章给大家介绍Java方法传参时采用哪种传递,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

我们来看一个新手甚至写了多年Java的朋友都可能不是十分确定的问题:

在Java方法传参时,究竟是引用传递还是值传递?

为了说明问题, 我给出一个非常简单的class定义:

public class Foo {   String attribute;   Foo(String s) {     this.attribute = s;   }   void setAttribute(String s) {     this.attribute = s;   }   String getAttribute() {     return this.attribute;   } }

下面在阐明观点时,可能会多次用到该类。

关于Java里值传递还是引用传递,至少从表现形式上来看,两种观点都有支撑的论据。下面我来一一分析:

观点1:引用传递

理由如下:先看一段代码

public class Main {   public static void modifyReference(Foo c){     c.setAttribute("c"); // line DDD   }    public static void main(String[] args) {     Foo fooRef = new Foo("a"); // line AAA     modifyReference(fooRef); // line BBB     System.out.println(fooRef.getAttribute()); // 输出 c   } }

上述示例,输出结果为"c",而不是"c"。

我们在line AAA处新创建了一个Object Foo并将其引用fooRef在line  BBB处传给了方法modifyReference()的参数cRef, 该方法内部处理后,fooRef指向的Object中的值从"a"变成了"c",  而引用fooRef还是那个引用, 因此,我们是否可以认为,在line BBB处发生了引用传递?

先留着疑问,我们继续往下看。

观点2:值传递

继续看一段代码

public class Main {   public static void changeReference(Foo aRef){     Foo bRef = new Foo("b");     aRef = bRef;   // line EEE   }      public static void main(String[] args) {     Foo fooRef = new Foo("a"); // line AAA     changeReference(fooRef); // line BBB     System.out.println(fooRef.getAttribute()); // 输出 a   } }

上述示例,输出结果为"a", 而不是"b"。

我们在line AAA处新创建了一个Object Foo并将其引用fooRef在line  EEE处传给了方法changeReference()的参数aRef, 该方法内部引用aRef在line  DDD处被重新赋值。如果是引用传递,那么引用aRef在line EEE处已经被指向了新的Object,  输出应该为"b"才对,事实上是怎样的呢?事实上输出了"b",也就是说changeReference()方法改变了传入引用所指对象的值。

观点1和观点2的输出结果多少会让人有些困惑,别急,我们继续往下看。

深入分析

为了详细分析这个问题,把上述两段代码合起来:

public class Main {   public static void modifyReference(Foo cRef){     cRef.setAttribute("c"); // line DDD   }   public static void changeReference(Foo aRef){     Foo bRef = new Foo("b"); // line FFF     aRef = bRef;   // line EEE   }      public static void main(String[] args) {     Foo fooRef = new Foo("a"); // line AAA     changeReference(fooRef); // line BBB     System.out.println(fooRef.getAttribute()); // 输出 a          modifyReference(fooRef); // line CCC     System.out.println(fooRef.getAttribute()); // 输出 c         } }

下面来深入内部来详细分析一下引用和Object内部的变化。来看下面图示:

① Line AAA, 申明一个名叫fooRef,类型为Foo的引用,并见其分配给一个新的包含属性值为"f"的对象,该对象类型为Foo。

Foo fooRef = new Foo("a"); // line AAA

 Java方法传参时采用哪种传递

② Line DDD, 方法内部,申明了一个Foo类型的名为aRef的引用,且aRef被初始化为null。

void changeReference(Foo a);

Java方法传参时采用哪种传递

③ Line CCC, changeReference()方法被调用后,引用aRef被分配给fooRef指向的对象。

changeReference(fooRef);

Java方法传参时采用哪种传递

④ Line FFF, 申明一个名叫bRef,类型为Foo的引用,并见其分配给一个新的包含属性值为"b"的对象,该对象类型为Foo。

Foo bRef = new Foo("b");

 Java方法传参时采用哪种传递

⑤ Line EEE, 将引用aRef重新分配给了包含属性"b"的对象。此处注意,并非将fooRef重新分配,而是aRef。

aRef = bRef;

 Java方法传参时采用哪种传递

⑥ Line CCC, 调用方法modifyReference(Foo  cRef)后,新建了一个引用cRef并将之分配到包含该属性"f"的对象上,该对象同时被两个引用fooRef和cRef指向着。

modifyReference(fooRef);

Java方法传参时采用哪种传递

⑦ Line DDD,  cRef.setAttribute("c");将会改变cRef引用指向的包含属性"f"的对象,而该对象同时被引用fooRef指向着。

cRef.setAttribute("c");

 Java方法传参时采用哪种传递

此时引用fooRef指向的对象内部属性值"f"也被重新设置为"c"。

Java内部方法传参不是引用传递,而是引用本身的"值"的传递,归根结底还是值传递。将一个对象的引用fooRef传给方法的形参newRef,将给该对象新增了一个引用,相当于多了一个alias。我们可以通过这个原引用fooRef,或这是方法参数里的新引用newRef去访问、操作原对象,也可以改变参数里的引用newRef本身的值,却无法改变原引用fooRef的值。

关于Java方法传参时采用哪种传递就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java方法传参时采用哪种传递

本文链接: https://www.lsjlt.com/news/287197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java方法传参时采用哪种传递
    这篇文章给大家介绍Java方法传参时采用哪种传递,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们来看一个新手甚至写了多年Java的朋友都可能不是十分确定的问题:在Java方法传参时,究竟是引用传递还是值传递为了说明问...
    99+
    2023-06-17
  • java传递参数的方法有哪些
    在Java中,传递参数的方法有以下几种:1. 值传递:基本数据类型(如int、char、boolean等)和字符串类型(String...
    99+
    2023-09-15
    java
  • java参数传递的方式有哪些
    在Java中,参数传递的方式有以下几种: 值传递:基本类型和不可变对象通过值传递方式进行参数传递。在值传递中,传递的是实际值的副...
    99+
    2024-02-29
    java
  • React传递参数的几种方式
    目录父子组件之间传递参数路由传参 状态提升context引入redux父子组件之间传递参数 父组件往子组件传值,直接用this.props就可以实现 在父组件中,给需要传递...
    99+
    2024-04-02
  • java方法怎么传递多个参数
    在Java中,可以使用以下几种方式传递多个参数给方法:1. 通过定义多个参数变量进行传递:```javapublic void me...
    99+
    2023-08-08
    java
  • Java参数传递方式详解
    Java中参数传递的方式是什么样的呢?是值传递还是引用传递呢? 答案是值传递。 为什么呢? 先来了解一些基础。。。。。 1. 形参&实参 形参:传递给函数/方法的参数,有确定的值 实参:定义函数...
    99+
    2023-09-16
    java 开发语言
  • 使用JPA传递参数的方法
    目录JPA传递参数的方法第一种第二种浅谈JPA优缺点一.JPA的理解二.JPA 实体生命周期理解和总结三.为什么要使用JPAJPA传递参数的方法 第一种         @Quer...
    99+
    2024-04-02
  • Shell参数传递的使用方法
    我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为: $n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…...
    99+
    2023-05-19
    Shell 参数传递 Shell 传递参数
  • Shell 参数传递的使用方法
    我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为: $n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……具体实例:以下实例我们向脚本传递三个参数,并分别输出...
    99+
    2023-05-12
    Shell 参数传递 Shell 传递参数
  • java string参数传递的方法是什么
    在Java中,字符串参数传递的方法是通过将字符串作为参数传递给方法。这可以通过以下几种方式实现: 传递字符串字面值:可以直接将字符...
    99+
    2023-10-26
    java string
  • java多参数传递的方法是什么
    在Java中,可以使用以下几种方式来实现多参数的传递: 使用数组:可以将多个参数封装成一个数组,然后将数组作为方法的参数进行传递。...
    99+
    2024-02-29
    java
  • java怎么将方法作为参数传递
    在Java中,可以使用函数式接口来将方法作为参数传递。函数式接口是只包含一个抽象方法的接口。通过lambda表达式或方法引用,可以将...
    99+
    2023-09-15
    java
  • PHP页面之间传递参数的三种方法
    php变量传递是非常常见的,比如一个简单的登录模块,首先需要创建登录表单,然后需要将登录表单页面的用户名和密码传递到登录处理页面进行判断用户名和密码是否正确,如果正确则进行登录成功的相关操作,如果错误就提示给用户账号密码有误。 以上所说的登...
    99+
    2023-09-09
    php
  • SpringMVC中参数的传递方法有哪些
    这篇文章主要介绍“SpringMVC中参数的传递方法有哪些”,在日常操作中,相信很多人在SpringMVC中参数的传递方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • C++ 函数参数的传递方式详解:值传递和引用传递
    c++++ 参数传递方式分为值传递和引用传递。值传递创建函数参数副本,不影响原变量;引用传递直接操作原变量。选择方式取决于需求:保护原变量使用值传递,修改原变量或提高效率使用引用传递。 ...
    99+
    2024-04-12
    c++ 函数参数传递
  • vb中传递参数的方法有哪些
    在VB中,传递参数的方法有以下几种: 通过值传递(ByVal):将参数的值传递给函数或子程序,不会影响原始变量的值。 通过引...
    99+
    2024-04-02
  • java线程传递参数的方式有哪些
    在Java中,线程传递参数的方式有以下几种: 使用构造函数传递参数:可以在创建线程对象时,通过构造函数将参数传递给线程对象。通过...
    99+
    2023-10-27
    java
  • Java必踩的坑之方法中形参、实参传递
    首先亮明Java中方法参数传递的规则,这两点很重要: 如果实参是基本类型(包括包装类型)或者String,则实参不会变(传的是值);如果实参是对象集合或者数组,则实参会改变(传的是引...
    99+
    2024-04-02
  • c语言函数参数传递方式有哪几种
    C语言函数参数传递方式有以下几种:1. 值传递(Pass by Value):将实际参数的值复制给形式参数,在函数内部对形参的修改不...
    99+
    2023-09-16
    c语言
  • python传参数的方法有哪几种
    在Python中,有以下几种方法可以传递参数: 位置参数:按照参数在函数定义中的顺序传递值。这是最常见的方法,参数的值根据位置进行...
    99+
    2024-02-29
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作