在 Java 中,方法的所有参数都是 “传值” 的
-
基本类型:数值的拷贝
-
引用类型:引用的拷贝
-
方法内部改变参数对象的状态(修改某属性),改变将反映到原始对象上
因为方法内部和外部引用的是同一个对象
-
方法内部改变参数本身的引用(引用新对象),改变不会反映到原始对象上
因为传递的是引用的拷贝,不是引用本身
-
public class Test {
public static void main(String[] args) {
int num = 10;
modifyNum(num);
System.out.println("变量num的值:" + num); // 10
String str1 = "hello";
modifyStr(str1);
System.out.println("变量str1的值:" + str1); // hello
String str2 = new String("hello");
modifyStr(str2);
System.out.println("变量str2的值:" + str2); // hello
// str1 字面量 字符串常量池
// str2 构造方法 堆内存区域
System.out.println(str1 == str2); // false
Panda panda = new Panda("萌兰", 5);
modifyPanda(panda);
System.out.println("panda的name:" + panda.getName()); // 么么
modifyReference(panda);
System.out.println(panda); // Panda{name='么么', age=5}
}
public static void modifyNum(int num) {
++num;
}
// 字符串是常量;它们的值在创建之后不能更改
// 无论是通过哪种方式创建的字符串对象,一旦创建后,其内容就不能被修改
public static void modifyStr(String str) {
str += "world";
}
public static void modifyPanda(Panda panda) {
panda.setName("么么");
}
public static void modifyReference(Panda panda) {
panda = new Panda("飞云", 10);
}
}