首页 > 编程语言 >Java 方法传参机制

Java 方法传参机制

时间:2024-09-22 19:51:52浏览次数:3  
标签:传参 arr Java int System 机制 main 方法 out

普通变量传参

在 Java中,一个方法可以选择需要参数或者无需参数,当方法需要参数时,传入参数都发生了什么变化是一个非常值得研究的问题,由此而来,我已自己所学来简单讲解一下其中的机制。

实例 1

这是一个交换两个数值的方法,方法传入了两个形参 a 和 b,交换之后并打印出来。

class MethodA {
    public void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a: " + a + ", b: " + b);
    }
}

思考一下,假如在 main 方法中调用了此方法,该方法会改变原有 main 方法中变量的值吗?

我们将它使用一下看看是什么效果

public class AA {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        MethodA ma = new MethodA();
        System.out.printf("MethodA方法中");
        ma.swap(a,b);
        System.out.println("main方法中 a="+a+" b="+b);
    }
}

运行完成之后发现结果如下:

运行结果

诶?这是应该我们会发出疑问,我们不是在swap 方法中交换了两个变量的值吗?怎么输出 ab 值还是没有变?

为了更好的理解其中的传参机制,我粗略的画个图解释一下

画板

在内存中,main 方法和 swap 方法位于栈中的不同空间,当在 main 方法中调用 swap 方法后,a 和 b 作为形参传到 swap 的空间,在 swap 方法空间中完成了数值交换,但是 main 方法中的 a 和 b 并没有发生转换,所以才会出现运行结果与我们所想的不同。

引用变量传参

上面解释了普通变量传参的机制,接下来讲讲引用变量传参机制。

实例2
class MethodB {
    public void Print(int[] arr)
    {
        arr[0] = 20;
        for(int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");
    }
}

我们以输出一个数组为例,为了能够掩饰出方法改变了数组的值,将数组第一个值改为 20,下面我们来使用这个方法

public class Jiou {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        MethodB b = new MethodB();
        System.out.printf("Print 方法输出的数组\n");
        b.Print(arr);
        System.out.println("main方法中输出的数组" );
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

运行结果如下:

输出结果

我们发现经过 Print 方法改变之后,数组的第一个值确实发生了改变,并且这个改变应用到了 main 方法中。我们发现这与普通变量传参并不一样。下面我也用简单的图解释一下

画板

我们知道引用变量其实是引用了堆里的一串地址,当 Print 方法需要参数时,其实是将数组的地址传入了,并且修改了地址中的数值,而 main 方法中的数组也引用相同的地址,这就导致 main 方法中的数组也发生了变化。

总结

简单的讲了讲传参机制的一些细节,希望你能理解

标签:传参,arr,Java,int,System,机制,main,方法,out
From: https://blog.csdn.net/weixin_70432322/article/details/142437363

相关文章

  • 基于Java Springboot 超市云购物系统
    一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件:JDK......
  • 基于Java Springboot 共享单车管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件......
  • 基于Java Springboot 中医学习服务管理系统
    一、作品包含源码+数据库+设计文档万字+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件:JDK......
  • 基于Java Springboot 共享单车管理系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue3、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA数据库:MySQL8.0数据库管理工具:Navicat10以上版本环境配置软件......
  • Java创建接口详细过程
    在Java中,创建mapper、dao(数据访问对象)、service、serviceImpl(service实现类)、controller等组件是构建企业级应用常见的分层架构模式。这种分层架构有助于实现高内聚低耦合的设计,提高代码的可维护性和可扩展性。mapperrXML文件创建MapperXML文件用于定义Java对象和数据库表......
  • 从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践
    从代码到部署:GitHubActions实现Java项目CI/CD的完整实践在现代软件开发中,持续集成和持续部署(CI/CD)已经成为了团队高效交付代码的关键策略。通过GitHubActions,可以轻松配置CI/CD流水线,实现从代码提交到部署的自动化工作流。本文将基于英语听力网站(studytool.site)项目介......
  • Java反射机制
    1、什么是Java反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。2、......
  • 使用java做一个微信机器人
    微信机器人这个功能,目前在市面上运用的还是不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群:也有的为了机器人对话聊天等等一系列。想必大家对微信机器人感兴趣的伙伴,也在aithub上面搜索了很多吧,但是大多数走到一半遇到各种bug就没有继续坚持走下去,原......
  • java基础
    java基础语法对象/类/方法/实例/继承对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色,名字,品种;行为有:摇尾巴,叫,吃等。类:类是一个模版,它描述一类对象的行为和状态方法:方法就是行为,一个类可以有很多方法。逻辑运算,数据修改以及所有动作都是在方法......
  • java计算机毕业设计抗疫资源调配平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球抗击新冠疫情的持久战中,资源的有效调配成为决定战役成败的关键因素之一。面对突如其来的疫情高峰,各地医院对医疗物资、人力资源的需求急剧增加......