java传递实例_Java方法的参数传递机制实例详解

本文实例讲述了Java方法的参数传递机制。分享给大家供大家参考,具体如下:

参数传递机制

对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递。

按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方法修改了该参数,调用代码中的原始值也随之改变。

需要注意的是,方法可以修改按引用传递的参数对应的变量值,但不可以修改按值传递的参数对应的变量值,这是两者的最大区别。

Java中的参数传递

Java中的参数传递机制只有一种,就是值传递。在Java中并没有C++的引用传递这种参数传递机制,它所有的参数传递都遵循值传递的机制。

Java中对于对象(数组,类,接口)的传递似乎有点像引用传递,可以改变对象中某个属性的值。但是不要被这个假象所蒙蔽,实际上这个传入方法的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。

基本类型的参数传递

在方法调用时,传递的参数是按值的拷贝传递;

public class Test {

public static void main(String[] args) {

Test t = new Test();

int a = 5;

t.method(a); // 传递后,method方法对变量值的改变不影响这里的a

System.out.println("method调用完后的a: " + a);

}

private void method(int a){

System.out.println("method中重新赋值之前的a: " + a);

a = 10;

System.out.println("method中重新赋值之后的a: " + a);

}

}

执行结果如下:

method中重新赋值之前的a: 5

method中重新赋值之后的a: 10

method调用完后的a: 5

由此可知按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。下面看一下内存分析:

77b50905611f06c90efd6e703cbedf8f.png

引用类型的参数传递

在方法调用时,传递的参数按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

public class Test {

public static void main(String[] args) {

Person person = new Person();

person.age = 18;

// 把main方法中的变量person所引用的内存空间地址,按引用传递给method方法中的person变量

// 请注意:这两个person变量是完全不同的,不要被名称相同所蒙蔽

method(person);

System.out.println("调用method方法之后:" + person.age);

}

public static void method(Person person){

person.age = 20;

System.out.println("method方法内第一次修改:" + person.age);

person = new Person(); // 新创建一个对象

person.age = 25;

System.out.println("method方法内第二次修改:" + person.age);

}

}

class Person {

public int age;

}

执行结果如下:

method方法内第一次修改:20

method方法内第二次修改:25

调用method方法之后:20

这里传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

e0aab71028d2296c47906ce5081b79ef.png

下面我们接着看一个例子:

public class Test {

public static void main(String[] args) {

int[] a = {5, 10};

method(a);

System.out.println("调用完method方法之后:" + a[0]);

}

public static void method(int[] a){

System.out.println("method内修改a[0]之前:" + a[0]);

a[0] = 50;

System.out.println("method内修改a[0]之后:" + a[0]);

}

}

执行结果如下:

method内修改a[0]之前:5

method内修改a[0]之后:50

调用完method方法之后:50

根据结果可知,调用method方法时实际传递的是引用的地址值。

a0364e1bb4ebeefd58087979511faacc.png

传递String类型的参数

由于String类是final修饰的,不可变,它会在内存中在开辟一块新空间。

public class Test {

public static void main(String[] args) {

String str1 = new String("test1");

String str2 = "test2";

method(str1, str2);

System.out.println("调用method传参str1之后:" + str1 + ", " + str2);

}

public static void method(String str1, String str2){

System.out.println("method内修改str之前:" + str1 + ", " + str2);

str1 = "new1";

str2 = "new2";

System.out.println("method内修改str之后:" + str1 + ", " + str2);

}

}

执行结果如下:

method内修改str之前:test1, test2

method内修改str之后:new1, new2

调用method传参str1之后:test1, test2

总结:

1)基本数据类型传递的是值的复制,对一个参数的修改不会影响另一个参数;

2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;

3)String、Integer、Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象(与基本数据类型一致)。

希望本文所述对大家java程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码发展专访系列之六:低代码平台能解决业务重构的问题么?

编辑 | 曹芊芊 话题:低代码发展系列专访 前言:2019年开始,低代码爆火。有人认为它是第四代编程语言,有人认为它是开发模式的颠覆,也有人认为是企业管理模式的变革……有很多声音,社区讨论很热烈。CSDN随后展…

在 Dubbo3.0 上服务治理的实践

简介: Dubbo 3.0 是在云原生背景下诞生的,使用 Dubbo 构建的微服务遵循云原生思想,能更好的复用底层云原生基础设施、贴合云原生微服务架构。 Dubbo3.0 介绍 作者 | 十眠 自从 Apache Dubbo 在 2011 年开源以来,经过多年一众大…

java 方法保存变量_java – 在初始化对象或将其保存为变量并调用该方法时,调用方法的速度更快...

其实这两段代码会有一点区别:***** Class1.p8: invokespecial #4 // Method ClassA."":(Ljava/lang/String;)V11: astore_312: aload_313: invokevirtual #5 // Method ClassA.getValue:()D16: dstore_117: dload_118: dreturn}***** CLASS2.P8: invokesp…

redis 可视化工具_自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer...

介绍在以往的文章中曾经介绍过几款Redis的可视化工具,在笔者的印象中,Redis至今没有一款非常专业的可视化管理客户端,就算之前介绍过的几款也是差强人意,有些时候满足不了我们的需求,而今天本文要介绍的是另一款值得推…

内核热补丁,真的安全么?

简介: Linux 内核函数的热替换“撞上”函数调用约定还靠谱吗? Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比如 kpatch 和 livepatch。内核热补丁可以修复内核中正在运行的…

谁是 2021「IT 圈」年度 C 位?快来报名,彰显你的影响力!

2021年,数字化转型正磅礴兴起,大批传统企业正在拥抱数字化,云计算、大数据、AI、5G应用能力正在变成企业的核心竞争力;核心技术正在崛起,在操作系统、数据库,依靠开源的力量,众多开发者背后的行…

当Java遇上机密计算,又一段奇幻之旅开始了!

简介: 汪少军:如何为Java业务提供机密计算保护? 写在前面 在信息世界里,数据存在三种状态: 存储态、传输态和计算态。存储在数据库或磁盘中的数据属于存储状态,在网络中传输的数据属于传输状态&#xff0c…

电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?

关注公众号,发现好教程如何设置电脑设置定时关机呢?哈哈哈,可能这个教程用处不大,不过每个教程都有它的用处,这个也算是教程哈!有些小伙伴可能需要这个教程!至于什么用处,我就不多说…

python django实例_python django 模板实例

操作系统MAC OS/LINUXwindows安装python3版本3自带virtualenv安装virtualenv: pip install virtualenv创建虚拟环境virtualenv env1进入虚拟环境mac os/linux下: source env1/bin/activatewindow下:source env1/Scripts/activate安装djangopip3 install …

时序数据库永远的难关 — 时间线膨胀(高基数 Cardinality)问题的解决方案

简介: 本文主要讨论 influxdb 在遇到写入的数据出现高基数 Cardinality 问题时,一些可行的解决方案。 作者 | 徐建伟 (竹影) 前序 随着移动端发展走向饱和,现在整个 IT 行业都期待着“万物互联”的物联网时代。在物…

中文巨量模型“源1.0”:模型结构与生成效果解析

浪潮人工智能研究院 “源 1.0”自 2021 年 9 月底发布以来收获了广泛的关注。其参数量达 2457 亿,超越美国 OpenAI 组织研发的 GPT-3。“源 1.0”在语言智能方面表现优异,获得中文语言理解评测基准 CLUE 榜单的零样本学习(zero-shot&#xff…

对话李飞飞,揭秘国际体育赛事风“云”背后的黑科技

简介: 众所周知,在重大体育赛事中,如何提高运动员的成绩,如何改善观众的参与体验,是体育组织越来越重视的问题。那么阿里云技术是如何帮助解决这个问题的呢? 今天,我们有幸邀请到阿里巴巴集团副…

python中gmtime的hour错误_python中gmtime的hour错误_在Python中操作日期和时间之gmtime()方法的使用...

python中datetime怎么用广告总是在最精彩的时候出现,你总是在小编爱的最深的时候离开。 日期相关的操作 from datetime import datetime from datetime import timedelta DATE_FMT %Y-%m-%d DATETIME_FMT %Y-%m-%d %H:%M:%S DATE_US_FMT %d/%m/%Y 格式化常用的…

webview键盘自适应_黑爵毛茸茸机械键盘:感受来自治愈系的暖萌

随着近几年电竞业的火爆,特别是女性玩家的增多,越来越多的外设厂商推出了个性化定制的产品,比如符合女生群体的鼠标、键盘、显卡甚至主板等。今天为大家介绍的这款黑爵毛茸茸机械键盘,是黑爵Project C系列的第三款主题键盘&#x…

阿里云云效技术专家分享:云原生开发、调测及可靠发布解决方案

简介: 高效开发、稳健发布。 在云原生环境中,基于Kubernetes的工具链一方面简化了开发者的许多日常琐碎,另一方面也带来了许多新的概念和工作方式的改变。本篇文章将聚焦于云原生基础设施,谈谈如何在面向云原生的开发流程中&…

代码质量第 5 层 - 只是实现了功能

产品实现的功能是产品价值的体现形式。功能实现是基础。功能没有实现,其他方面做得再好也没有意义。那么,如何保证实现的功能覆盖了需求呢? 产品实现的功能是产品价值的体现形式。功能实现是基础。功能没有实现,其他方面做得再好也…

python os.walk不递归_python-os.walk目录递归

递归删除文件或目录:递归,os.walk删除目录,shutil.rmtree1 #-*- coding: UTF-8 -*-2 importos.path,sys,shutil34 path H:/test567 for root ,dirs ,files inos.walk(path):8 printroot,dirs,files9 for name indirs:10 if name svn:11 pri…

阿里巴巴 DevOps 工具体系

简介: 随着阿里巴巴多元化业务 20 多年的高速发展,技术体系经历了 web 时代、移动化时代、数据智能时代、云计算时代等多个重大变革。在这些变革中,开发者面对的技术体系、工具体系、知识体系也在不断进化。研发工具在其中起到了技术规模化和…

在java中使用quartz_如何在Java中使用Quartz Scheduler框架运行cron作业?

我在Java中使用Quartz Scheduler来运行cron作业 . 这是我第一次使用这个框架来运行cron作业,所以我有些困惑 .我正在关注这个tutorial以更好地理解如何使用Quartz框架 .我想每周和每个月都运行 JobA 所以我从基本的例子开始 -这是我到目前为止的例子 .public class …

云原生引领全云开发时代

简介: 云原生是近几年最火爆的技术热词之一,几乎所有的云计算产品都会或多或少跟云原生发生关联,云原生正在重塑整个软件的生命周期。但到底什么是云原生?云原生带来的最大的技术创新和未来机会是什么?以及&#xff0c…