没有好的名字 2022-04-28 17:06 采纳率: 33.3%
浏览 107
已结题

为什么方法没返回,也能改变上级方法的值

如以下代码,为什么两个change方法,都是返回的void,但map的值却变了,string的值没变,这是为何?

public class Test {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("a", "123");
        change(map);
        System.out.println(map);
        String a = "aaa";
        change(a);
        System.out.println(a);
    }

    private static void change(String a) {
        a = "bbb";
    }

    private static void change(Map map) {
        map.put("b", "456");
    }
}
输出:
{b=456, a=123}
aaa
  • 写回答

2条回答 默认 最新

  • 不甘_ 2022-04-28 17:29
    关注

    Java参数:不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,传值一般相对于传地址而言)

    若参数类型是基本数据类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值

    若参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址,如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new了一个,那么副本就指向了新的地址,此时传入的参数还是指向原来的地址,所以不会改变原来的值。

    一般而言,当你传递的是八大基本数据类型,在方法里面怎么变化都不会影响到外部的值
    但是引用类型就不一样,因为你传递进去的是地址,你在方法内部修改,外部也会随机变化

    如有帮助,望采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 已采纳回答 4月28日
  • 修改了问题 4月28日
  • 创建了问题 4月28日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度