Java参数传递方式详解

这篇具有很好参考价值的文章主要介绍了Java参数传递方式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中参数传递的方式是什么样的呢?是值传递还是引用传递呢?
答案是值传递。
为什么呢?
先来了解一些基础。。。。。

1. 形参&实参

	形参:传递给函数/方法的参数,有确定的值
	
    实参:定义函数/方法,用于接收实参,函数/方法调用前没有确定的值。
String test = "This is a test";
//test是实参
outPutTest(test);
//str是形参
//outPutTest函数调用之前,str没有确定的值
void outPutTest(String str){
    System.out.println(str);
}
    注:只有在函数调用、定义时才有形参&实参的概念,没有函数调用时,test是变量。

2. 值传递&引用传递

语言中将实参传递给函数 / 方法的方式有两种:值传递和引用传递。

值传递:调用函数 / 方法时,将实参进行拷贝,再由函数 / 方法接收拷贝值;即对形参的修改是修改的额拷贝值,对实参值无影响。

引用传递:这种传递方式下,函数 / 方法接收的是实参所引用对象的堆地址;即对形参的修改就是对实参的修改。

3. Java中参数传递的方式

Java中参数传递的方式是值传递,且只有值传递,没有引用传递。

这又是从何而知的呢?来看以下代码:
int num = 1;

System.out.println("num="+num);
exTest(num);
System.out.println("num="+num);

public static void exTest(int a){
	a +=10;
	System.out.println("a="+a);
}
这段代码的输出如下:
num=1
a=11
num=1
函数中不是已经修改值了吗?为什么调用函数之后num的值还是没有变呢?
这就是因为Java中的参数传递是值传递,而不是引用传递,如果是引用传递,那么函数调用后num的值就会改变。
但由于值传递方式中,函数接收的是num的拷贝值,修改的也是拷贝值,原值并不会改变。

基础数据类型如此,那么引用数据类型呢?看如代码:
String name = "Tom";
int[] arr = {1,1,1};

System.out.println(name + "第" + arr[0]);
exTest(name,arr);
System.out.println(name + "第" + arr[0]);

public static void exTest(String newName,int[] array){
	name = "Jerry";
	array[0] = 2;
	System.out.println(name + "第" + array[0]);
}
Tom第1
Jerry第2
Tom第2
为什么是这样的呢?

首先实参String类型的name的值没有改变很容易理解,变量name存的是字符串“Tom”在堆中的地址,通过值传递拷贝传递给形参newName后,
newName中存的便是“Tom”的地址了。但由于字符串堆存储的不可改特性,所以将“Jerry”赋值给newName就是在堆中new出“Jerry”,newName存其地址。
而函数外部的实参name的值未变,还是“Tom”的堆地址。

那么arr[0]的值为什么改变了呢?
同String类型的name,exTest方法接收的是拷贝的arr(实参)的地址,即array(形参)和arr(实参)指向的是同一个数组地址空间,
所以,函数中array[0]的值修改,arr[0]的值也会修改,因为它们指向同一个空间。


那么对象的传递呢?再看如下代码:
@Data 
public class Animal {
    private String name;
}

public static void main(String[] args) {
    Animal tom = new Animal("Tom");
    Animal jerry = new Animal("Jerry");
    
    System.out.println("tom:" + tom.getName());
    System.out.println("jerry:" + jerry.getName());
    swap(tom, jerry);
    System.out.println("tom:" + tom.getName());
    System.out.println("jerry:" + jerry.getName());
}

public static void swap(Animal animal1, Animal animal2) {
    Animal temp = animal1;
    animal1 = animal2;
    animal2 = temp;
    System.out.println("person1:" + animal1.getName());
    System.out.println("person2:" + animal2.getName());
}
输出如下:
tom:Tom
jerry:Jerry
person1:Jerry
person2:Tom
tom:Tom
jerry:Jerry
可见,形参的互换没有影响到实参。
是由于该方法的参数只是拷贝了实参的地址(name的地址),而方法中的交换也只是交换了地址而已,并不会影响实参,

总结

Java中参数传递方式是值传递,且只有值传递,没有引用传递。

参考

JavaGuide Java值传递详解文章来源地址https://www.toymoban.com/news/detail-731032.html

到了这里,关于Java参数传递方式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行,不用区分post和get请求方法,当然java代码要改变一点,在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求: 代码:注意在响应注解的方法里面新添加了形参,其就对应着上面图片中的参数

    2024年02月07日
    浏览(10)
  • json传参到java接口部分参数接收不到

    json传参到java接口部分参数接收不到

    使用postman传参时,接口参数中有部分参数被传递进了接口内部,还有部分参数没有接收到,如下图:第一张图是postman接口参数,第二张图是接收到的参数 图一: 图二: 这个问题其实解决很简单,就是json数据转化为实体的过程,找寻get、set方法失败,导致数据无法正常从

    2023年04月10日
    浏览(14)
  • java 的参数传递

    java 的参数传递

    首先,我们从一个例子来引出这个问题: 请问,1,2,3,4 处分别输出的应该是什么? 答案是: 看到这里,同学对 1,2,4 的结果肯定是不会有疑问,可能会有一部分同学会对 3 的输出有些疑问,change方法不是对序列进行了倒排,为啥3 处mockList 的序列没变,如果有这个疑问的同学

    2024年02月02日
    浏览(6)
  • 如何给Java中的main函数参数args传参

    如何给Java中的main函数参数args传参

    创建java测试类: JAVA类中main函数的参数String [] args,指的是运行时给main函数传递的参数。 传参的方式有以下几种: 1、idea工具的测试类中,左上角菜单中点击Run,选择Edit Configurations…,找到Program Arguments,添加参数   参数添加成功后,运行Java测试类后,结果如下:   2、

    2024年02月08日
    浏览(7)
  • 微信小程序如何实现页面传参和页面传递多个参数

    微信小程序如何实现页面传参和页面传递多个参数

    只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 4 种页面方法。 下面时多个参数页面传参的方式   通过在url后面拼接参数,参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 分隔;如 ‘path?key=valuekey2=value2’。 案例:

    2024年02月11日
    浏览(37)
  • [uniapp的页面传参]详细讲解uniapp中页面传参的传递方式和接受方式 使用案例 代码注释

    在uniapp中,页面传参是非常常见的需求。本文将详细讲解uniapp中页面传参的传递方式和接受方式,以及使用案例,同时附上代码注释。 1. URL传参 URL传参是一种比较简单的传递方式,它是通过URL地址来传递参数的。我们可以在URL地址后面加上参数,例如: 在接收页面中,我们

    2024年02月19日
    浏览(9)
  • python main 函数-启动-传递参数 python 打包 exe C# 进程传参

    python main 函数-启动-传递参数 python 打包 exe C# 进程传参

    在Python编程中,我们经常需要从命令行或其他外部环境中获取参数。Python提供了一种简单而灵活的方式来处理这些参数,即通过main函数传参 1.python main 函数-启动-传递参数 test.py 2. 如果直接传参给 脚本 输出:  输入 aa bb cc cc pyinstaller是一个流行的Python打包工具,它可以将P

    2024年02月09日
    浏览(9)
  • 深入浅出Java中参数传递的原理

    深入浅出Java中参数传递的原理

    今天,想和大家聊聊关于java中的参数传递的原理,参数的传递有两种,值传递和引用传递。 值传递 :是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递 :是指在调用函数时将实际参数的地址传递到

    2024年02月01日
    浏览(8)
  • Java获取URL地址中传递的参数

    一、 Java获取URL地址中传递的参数 二、获取请求的URL地址 三、获取请求的IP地址 四:判断字符串是否能够转换成指定格式的日期

    2024年02月16日
    浏览(8)
  • java 通过行为参数化传递代码,来解决不断增长的需求

    2.1, 匿名内部类 2.2 lamble表达式

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包