什么是值传递:
对形参的修改不会影响到实参。
什么是引用传递:
对形参的修改会影响到实参。
基本数据类型的参数传递
public static void main(String[] args) {
int a = 8;
f(a);
System.out.println("实参:" + a);
}
public static void f(int a) {
a = 16;
System.out.println("形参:" + a);
}
打印结果
形参:16
实参:8
可见 java 对基本数据类型是 值传递。
引用对象参数的传递
修改方法中修改对象的参数。
public static void main(String[] args) {
Person a = new Person(8);
f(a);
System.out.println("实参:" + a);
}
public static void f(Person a) {
a.age = 16;
System.out.println("形参:" + a);
}
打印结果
形参:Person(age=16)
实参:Person(age=16)
从结果参数来看,看似是是在 方法 f(Person a) 中修改了 对象 a 的参数 age 的值(从8转到16),但实际上 如果我们直接打印对象的地址就会发现
public static void main(String[] args) {
Person a = new Person(8);
System.out.println("原值:" + a);
f(a);
System.out.println("实参:" + a);
}
public static void f(Person a) {
a.age = 16;
System.out.println("形参:" + a);
}
原值:org.zyz.jvm.entity.Person@5e91993f
形参:org.zyz.jvm.entity.Person@5e91993f
实参:org.zyz.jvm.entity.Person@5e91993f
实际上虽然对象的元素发生了变化,但是对于对象 a 而言,并没有变化,对象还是 5e91993f。所以对于引用对象其实还是值传递。
引用对象参数的传递中重新对对象赋值
public static void main(String[] args) {
Person a = new Person(8);
f(a);
System.out.println("实参:" + a);
}
public static void f(Person a) {
a = new Person(16);
System.out.println("形参:" + a);
}
打印结果
形参:Person(age=16)
实参:Person(age=8)
同上打印对象的引用地址
public static void main(String[] args) {
Person a = new Person(8);
System.out.println("原值:" + a);
f(a);
System.out.println("实参:" + a);
}
public static void f(Person a) {
a = new Person(16);
System.out.println("形参:" + a);
}
原值:org.zyz.jvm.entity.Person@5e91993f
形参:org.zyz.jvm.entity.Person@1c4af82c
实参:org.zyz.jvm.entity.Person@5e91993f
如果参数对象在方法中重新赋值(new )之后,新的对象并不会将数据传递会原来的main方法的对象中。