关于Java传参时是引用传递还是值传递有很多讨论
有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑
先上代码(自己先猜猜看结果)
package io.renren.utils; import java.util.HashMap; import java.util.Map; public class testUtils { public static void main(String[] args){ Map<String, String> map = new HashMap<String, String>(); Student student = new Student(); student.setName("000000"); map.put("aaaa", "000000"); int a = 1111; System.out.println(a); System.out.println("map:"+map.get("aaaa")); System.out.println("student:"+student.getName()); setValue0(a); System.out.println("setValue0:"+ a); setValue(map); System.out.println("setValue:"+map.get("aaaa")); setName(student); System.out.println("setName:"+student.getName()); setName1(student); System.out.println("setName1:"+student.getName()); } private static void setName1(Student student) { student = new Student(); student.setName("000000"); } static void setValue0(int a){ a = 00000; } static void setValue(Map<String, String> map){ map.put("aaaa", "1111111111"); } static void setName(Student map){ map.setName("1111111111"); } static class Student{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } }
分析结论
1 基本类型作为参数:
首先:基本数据类型在声明时系统就给它分配空间:
其次:方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
2 引用类型:
首先:引用则不同,它声明时只给变量分配了引用空间,而不分配数据空间
其次:在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
运行结果: