浅谈Java中方法参数传递的问题

 更新时间:2017年08月24日 09:05:42   投稿:jingxian  
下面小编就为大家带来一篇浅谈Java中方法参数传递的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了。这种传递方式,我们称为参数传递。在这里,定义方法时,参数列表中的变量,我们称为形式参数。

调用方法时,传入给方法的数值,我们称为实际参数

在Java中调用方法时,如果参数是基本类型(byte/short/int/long/float/double/char/boolean)以及String类型时,形式参数的改变不影响实际参数。

以下代码在内存中发生的动作:

最开始时,方法区中存入main()方法文件,然后在栈中main()方法入栈(压栈),局部变量入栈初始化,执行到change()方法,方法区中有change()文件,接着change()入栈,实参a/b将自己的值赋值给形参a/b,执行方法中的代码,形参a变为20,形参b变为40,执行完后,change()方法立刻出栈(弹栈),形参a/b也从内存中消除。期间并没有影响到实参的值。

如果是引用数据类型(不包括String),比如数组int[ ],形参的改变会影响到实参。

最开始时,方法区中存入main()方法文件,然后在栈中main()方法入栈(压栈),创建用静态方法创建数组,相当于new了一个int[],凡是new出来的都要进入堆中,在堆中划出一块内存空间,分成5份用来存储5个元素,先初始化元素的值全为0,然后将每个变量赋值1,2,3,4,5,然后将开辟的这块内存地址0x1234赋给arr。执行到change()方法,方法区中有change()文件,接着change()入栈,实参arr将地址值赋值给形参arr,实参和形参都指向堆中开辟的内存,然后在change()中,将数组中的偶数元素变为2倍,改变的就是堆内存中的数据。然后change()方法执行完后出栈,主方法中打印数组,实参arr仍指向对内存中的已经改变的数组,并输出。形参的改变影响到实参的数值。

对于String类型比较特殊,它本身是引用数据类型,但是在这里按基本数据处理。因为字符串的本质是字符数组,在方法区中有专门一块地方叫字符串常量池用来存储字符串常量.这里记住:凡是用双引号引起来的都是字符串常量,存储在字符串常量池当中.如图中的”hello”字符串存储在字符串常量池中,地址值为0x666,然后Stirng str1 = new String(“hello”),在堆中开辟一块内存,将”hello”的地址值0x666存储在内存中,同时将该内存的地址值0x999赋给str1.然后String str2 = “hello”,将”hello”的地址值0x666直接赋给str2.

String有一个特点,每改变一次就会在字符串常量池中生成一个新的常量,比如String s = ”hello”在字符串常量池中的地址是0x666,然后s = “hello”+1,此时的字符串常量池会开辟一块新的空间给”hello1”,地址值为0x333,再将地址值赋值给s.所以,String s = “hello”,将s作为实参传递给方法时,无论形参中的s怎么改变都不会影响到0x666的”hello”,也不会影响到实参s.所以String虽然作为引用数据类型,但它形参的变化不会影响到实参.

以上这篇浅谈Java中方法参数传递的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java web自定义filter代码实例

    Java web自定义filter代码实例

    这篇文章主要介绍了Java web自定义filter代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 关于@RequestParam注解的使用(简单易懂)

    关于@RequestParam注解的使用(简单易懂)

    这篇文章主要介绍了关于@RequestParam注解的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 浅谈Strut2如何对请求参数的封装

    浅谈Strut2如何对请求参数的封装

    这篇文章主要介绍了浅谈Strut2如何对请求参数的封装,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java中的Lock与ReentrantLock深入解析

    Java中的Lock与ReentrantLock深入解析

    这篇文章主要介绍了Java中的Lock与ReentrantLock深入解析,Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样,但是,Lock比synchronized块更灵活、更复杂,需要的朋友可以参考下
    2024-01-01
  • 详解SpringBoot Starter作用及原理

    详解SpringBoot Starter作用及原理

    大家都知道基于 SpringBoot 开发项目可以简化 Spring 应用的搭建以及开发过程,提高程序员开发效率,这是由于其“约定大约配置”的策略及其自动装配的特点,Starter 就是自动装配的具体实现,本文详细介绍了SpringBoot Starter作用及原理,欢迎大家来阅读学习
    2023-04-04
  • springboot 使用ThreadLocal的实例代码

    springboot 使用ThreadLocal的实例代码

    这篇文章主要介绍了springboot 使用ThreadLocal的实例代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • MybatisPlus之likeRight的用法

    MybatisPlus之likeRight的用法

    这篇文章主要介绍了MybatisPlus之likeRight的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • spring boot空属性赋值问题与aspect日志实现方法

    spring boot空属性赋值问题与aspect日志实现方法

    这篇文章主要介绍了spring boot空属性赋值问题与aspect日志实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot中的Spring Cloud Hystrix原理和用法详解

    SpringBoot中的Spring Cloud Hystrix原理和用法详解

    在Spring Cloud中,Hystrix是一个非常重要的组件,Hystrix可以帮助我们构建具有韧性的分布式系统,保证系统的可用性和稳定性,在本文中,我们将介绍SpringBoot中的Hystrix,包括其原理和如何使用,需要的朋友可以参考下
    2023-07-07
  • Spring事务失效之常见场景分析

    Spring事务失效之常见场景分析

    这篇文章主要介绍了Spring事务失效之常见场景,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论