我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java 的参数传递

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java 的参数传递

一、疑惑引入

首先,我们从一个例子来引出这个问题:

public static void main(String[] args) throws IOException {    List mockList = Lists.newArrayList("a", "b");    System.out.println("1: " + mockList);    List result = change(mockList);    System.out.println("3: " + mockList);    System.out.println("4: " + result);}public static List change(List input){    List result = input.stream().sorted(Comparator.comparing(String::valueOf).reversed()).collect(Collectors.toList());    System.out.println("2: " + result);    return result;}

请问,1,2,3,4 处分别输出的应该是什么?
答案是:

1: [a, b]2: [b, a]3: [a, b]4: [b, a]

看到这里,同学对 1,2,4 的结果肯定是不会有疑问,可能会有一部分同学会对 3 的输出有些疑问,change方法不是对序列进行了倒排,为啥3 处mockList 的序列没变,如果有这个疑问的同学,那么你有必要要认真看下本文;
常见大家理解的误区可能有以下几点:

  1. 值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。
  2. Java是引用传递。
  3. 传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递

二、概念理解

首先,要理解这个问题,我们先来了解下几个概念

2.1、形参、实参

在编程中,参数(parameters)是指在函数定义中声明的占位符,用于接收传递给函数的值。

  • 形参(formal parameters)是函数定义中使用的参数名称,它们在函数定义时被声明。
  • 实参(actual parameters)是在函数调用时传递给函数的实际值。
    具体来说,形参是函数定义时使用的变量名,用于表示函数内部使用的值。它们在函数定义的括号内列出,并且可以有一个或多个。形参是函数内部的局部变量,只在函数内部可见和使用。
    下面是一个示例函数定义,其中x和y是形参:
def add_numbers(x, y):    sum = x + y    return sum

在这个例子中,add_numbers函数接受两个形参x和y,并返回它们的和。
实参是在函数调用时传递给函数的具体值。它们是实际用于执行函数操作的值。在函数调用时,实参被传递给函数,填充形参,并在函数体内使用。
下面是调用上述函数并传递实参的示例:

result = add_numbers(3, 5)

在这个例子中,3和5是传递给add_numbers函数的实参。函数将使用这些实参来执行计算并返回结果。

以上解释来自chatGpt

显然可能有点啰嗦,喜欢直接一点的同学直接看红框
[图片]

2.2、值传递和引用传递

值传递(pass by value)是指在函数调用时,将实参的值复制一份给形参,函数内部对形参的修改不会影响到原始实参的值。
引用传递(pass by reference)是指在函数调用时,将实参的引用(地址)传递给形参,函数内部对形参的修改会影响到原始实参的值。
简单来说,值传递是对实参进行拷贝,函数内部的操作不会影响到原始实参;而引用传递是对实参的引用进行操作,函数内部的修改会影响到原始实参。

以上解释来自chatGpt

值传递和引用传递的对比如下:
在这里插入图片描述

三、实操

例子一

上个例子:

public static void main(String[] args) throws IOException {    int i = 1;    change(i);    System.out.println(i);}public static void change(int a){    a = 10;}

输出:

1

图例:
在这里插入图片描述

由这个例子可见,i 的值还是1,change 方法并没有更改 i 的值,所以是不是可以得出 java 的方法传递是值传递?
那我们开始看下面这个

例子二

public static void main(String[] args) throws IOException {    User user = new User();    user.setName("yy");    change(user);    System.out.println(user.getName());}public static void change(User a){    a.setName("xx");}

同样是一个change方法,同样是在change方法内修改参数的值,输出:

xx

图例:
暂时无法在飞书文档外展示此内容

经过change方法执行后,实参的值被改变了,那按照上面2.2的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。那根据上面的两段代码,可以得出新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递,真的是这样吗?其实这个表述还是有误的,不信看下面这个

例子三

public static void main(String[] args) throws IOException {    String name = "yy";    change(name);    System.out.println(name);}public static void change(String input){    input = "xx";}

输出结果是:

yy

这个结果好像和上面的 在传递对象类型的时候是引用传递 的结论不符合。同样传递了一个对象,但是对象的原始值却没有改变;name为什么会是这样的呢,我们先来看下图例:
图例:
暂时无法在飞书文档外展示此内容

what?形参input 为啥会是新的内存地址呢?
其实,我们在change(name) 方法中想去修改name 的值,其实阴差阳错的直接修改了input 的应用地址,因为
input = “xx” 的背后是 会 new 一个 string ,把新的引用交给 input,等价于 input = new String(“xx”) 。原来的 “yy” 这个字符串还是由name 持有着,并没有修改到实际参数的值;所以 java 还是值传递,只不过对于对象参数,值是对象的引用地址;

好了,经过上面的概念理解和三个例子,大家应该基本了解了java 的参数传递,那我们把文章开头的例子改一下,输出会是什么样子呢?

public static void main(String[] args) throws IOException {    List mockList = Lists.newArrayList("a", "b");    System.out.println("1: " + mockList);    List result = change(mockList);    System.out.println("3: " + mockList);    System.out.println("4: " + result);}public static List change(List input){    Collections.sort(input, Comparator.reverseOrder());    System.out.println("2: " + input);    List result = input;    return result;}

输出:

1: [a, b]2: [b, a]3: [b, a]4: [b, a]

有些同学可能会疑惑,为啥这里 3 输出的又是[b, a]呢,不是说java 是值传递, input 形参的修改不会影响到原来的 mockList 的内容吗?
其实 这里 Collections.sort(input, Comparator.reverseOrder()); 的问题,这个和 input.stream().sorted(Comparator.comparing(String::valueOf).reversed()).collect(Collectors.toList()); 的区别是:

  1. stream() 不会影响到原来集合的内容;Stream API 不会改变数据源,所有操作的最终结果会保存到另外一个对象中。(peek 方法除外,它会修改流中的元素)
  2. sort 却会改变原来内存地址指向的集合内容(本质是对List 内部的数组进行排序);

来源地址:https://blog.csdn.net/qq_20989105/article/details/130477913

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java 的参数传递

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

下载Word文档

猜你喜欢

java 的参数传递

一、疑惑引入 首先,我们从一个例子来引出这个问题: public static void main(String[] args) throws IOException { List mockList = Lists.newArrayL
java 的参数传递
2023-12-23

java 函数的参数传递

The Java programming language always uses call by value. That means that the method gets a copy of all parameter values.
2023-06-03

java参数怎么传递参数

计算机语言给子程序传递参数的方法有两种:按值传递(call-by-value):这种方法将一个参数值复制成子程序的正式参数。这样,对子程序的参数的改变不影响调用它的参数。引用调用(call-by-reference):在这种方法中,参数的引用(而不是参数值)被
java参数怎么传递参数
2020-12-17

java的参数传递(只有值传递没有引用传递)

为什么改变引用变量的属性值却可以呢?请看下面的解答。java中的数据类型Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保存的值是引用值,"引
java的参数传递(只有值传递没有引用传递)
2015-05-18

php函数间的参数传递(值传递/引用传递)

函数间的参数传递包括值传递和引用传递,详细示例接下来为大家详细介绍下,感兴趣的朋友不要错过
2022-11-15

Java中参数传递是怎样的

这篇文章主要介绍“Java中参数传递是怎样的”,在日常操作中,相信很多人在Java中参数传递是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中参数传递是怎样的”的疑惑有所帮助!接下来,请跟着小编
2023-06-22

Java中参数传递类型的定义

本篇内容介绍了“Java中参数传递类型的定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先看定义:值传递,是指方法接收的是调用者提供的值
2023-06-17

java传递参数的方法有哪些

在Java中,传递参数的方法有以下几种:1. 值传递:基本数据类型(如int、char、boolean等)和字符串类型(String)都是以值传递的方式进行参数传递。在方法内对参数的修改不会影响原始值。2. 引用传递:对于引用类型(如数组、
2023-09-15

java参数传递的方式有哪些

在Java中,参数传递的方式有以下几种:值传递:基本类型和不可变对象通过值传递方式进行参数传递。在值传递中,传递的是实际值的副本,对副本的修改不会影响原始值。引用传递:可变对象通过引用传递方式进行参数传递。在引用传递中,传递的是对象的引用,
java参数传递的方式有哪些
2024-02-29

golang函数的参数传递

Go 函数的参数传递在 Go 中,函数通过值传递或引用传递传递参数。了解这两种传递方式之间的差异对于优化代码性能和避免意外行为至关重要。值传递当以值传递方式传递参数时,函数会收到参数值的副本。这意味着对参数值的任何修改都不会影响函数外
golang函数的参数传递
2024-04-20

java数组怎么作为参数传递

在Java中,数组作为参数传递的方式与普通的变量类似。你可以将一个数组作为方法的参数,然后在方法内部使用该数组进行操作。下面是一个示例:public class Main {public static void main(String[
2023-10-26

java string参数传递的方法是什么

在Java中,字符串参数传递的方法是通过将字符串作为参数传递给方法。这可以通过以下几种方式实现:传递字符串字面值:可以直接将字符串字面值作为参数传递给方法。例如:public void printString(String str) {S
2023-10-26

java多参数传递的方法是什么

在Java中,可以使用以下几种方式来实现多参数的传递:使用数组:可以将多个参数封装成一个数组,然后将数组作为方法的参数进行传递。例如:public void myMethod(int[] params) {// 使用params数组中的参数
java多参数传递的方法是什么
2024-02-29

C++ 函数参数的传递方式详解:值传递和引用传递

c++++ 参数传递方式分为值传递和引用传递。值传递创建函数参数副本,不影响原变量;引用传递直接操作原变量。选择方式取决于需求:保护原变量使用值传递,修改原变量或提高效率使用引用传递。C++ 函数参数的传递方式详解:值传递和引用传递在 C
C++ 函数参数的传递方式详解:值传递和引用传递
2024-04-12

Java中怎么对参数进行传递

本篇文章给大家分享的是有关Java中怎么对参数进行传递,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录