Java中形参值改变什么时候会改变实参 您所在的位置:网站首页 形参指针的变化不影响实参 Java中形参值改变什么时候会改变实参

Java中形参值改变什么时候会改变实参

2024-02-28 10:16| 来源: 网络整理| 查看: 265

        刚学习Java的时候应该都听过Java中没有指针,所以实参传基本数据类型形参改变不会影响实参(基本数据类型存在栈中方法结束后,形参会被弹出栈,实参并没有变化),而实参传入引用数据类型时形参改变会影响实参(引用数据类型存在堆中,方法结束堆中不会被清除)

        但最近发现一个问题,上代码:

public static void main(String[] args) { String str = new String("world"); char[] ch = new char[]{'h','e','l','l','o'}; Integer a = 10; change(str,ch, a); System.out.println(str); System.out.println(String.valueOf(ch)); System.out.println(a); } public static void change(String str, char[] arr, Integer a){ a = 11; str = "change"; char[] ch = new char[]{'d','s','h'}; arr = ch; }

这个程序的结果在之前我以为会输出change,dsh,11但是当运行后结果却是world,hello,10,

它们的值一个都没有改变,后来仔细又研究了一下程序运行时的存储方式才发现问题:

Integer类型在方法中,a中原本存着指向10的地址,但是当a = 11 时会默认装箱又创建了一个新对象内容为11,a存着的地址换成了一个新地址指向11,但main方法中a中的地址还是指向10仅仅调用方法中参数指向的地址发生了改变;

String类型str原本在main方法中在常量池生成一个world值,String每次赋值一个不同字符串时都会在常量池重新开辟一个新空间 存放不同字符串,所以change方法中str存的地址由指向world转到指向change,但main方法中str中的地址还是指向world.char[]类型同理

但是为什么又说引用类型当参数传入时形参会影响实参呢,其实这要取决于传入参数后改变的是参数中地址指向的值还是参数中存入的地址,实参和形参存入的地址都指向同一个地方,形参改变其中的值实参也会跟着改变,但当形参改变的是其中存入的地址时,实参仍是指向原本的地址其中的内容并没有发生改变.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有