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

作者:jingxian 时间:2021-11-06 04:24:46 

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

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

在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也从内存中消除。期间并没有影响到实参的值。

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

如果是引用数据类型(不包括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.

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

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

来源:http://www.cnblogs.com/guoguotju/p/7419736.html

标签:java,方法,参数,传递
0
投稿

猜你喜欢

  • Android自定义水平渐变进度条

    2022-06-02 14:22:42
  • java和Spring中观察者模式的应用详解

    2023-04-21 00:16:17
  • Java截取字符串的方法

    2023-11-07 09:30:02
  • Android仿淘宝物流信息TimeLineView

    2023-10-09 20:12:47
  • C#实现创建标签PDF文件的示例代码

    2023-09-15 07:04:58
  • Android中实现图文并茂的按钮实例代码

    2022-10-18 22:58:49
  • android侧滑菜单控件DrawerLayout使用方法详解

    2023-02-02 23:58:43
  • 通过LinQ查询字符出现次数的实例方法

    2023-12-10 13:40:01
  • Java @Accessors注解图文详解

    2023-10-10 06:06:51
  • java8 stream自定义分组求和并排序的实现

    2022-09-12 04:08:26
  • java.lang.NoClassDefFoundError错误解决办法

    2021-12-29 03:52:27
  • SpringBoot+SpringSession+Redis实现session共享及唯一登录示例

    2023-10-07 07:56:17
  • SpringBoot如何在普通类加载Spring容器

    2023-10-06 03:56:27
  • java实现双色球抽奖算法

    2023-11-28 23:51:51
  • android开发教程之清除android数据缓存示例(清除本地数据缓存)

    2021-10-14 16:11:42
  • C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    2021-06-06 04:59:48
  • C#获取进程和对进程的操作

    2021-07-14 19:50:35
  • Java 函数编程详细介绍

    2022-07-18 14:31:15
  • C#生成MD5的函数代码

    2021-08-04 14:50:24
  • IDEA-Maven项目的jdk版本设置方法

    2022-07-21 16:04:17
  • asp之家 软件编程 m.aspxhome.com