定义
- 值传递:会创建副本,函数中无法改变原始对象,类类型时,复制对象的引用
- 引用传递:不创建副本,函数中可以改变原始对象
public class TestPass {
public static void methodPassInt(int i) {
i = 20;
System.out.println("inner method:" + i);
}
public static void method1(StringBuilder s) {
s = new StringBuilder(", hello method1");
System.out.println("inner method1:" + s + " " + "hashcode:" + s.hashCode());
}
public static void method2(StringBuilder s) {
s.append(", method2");
System.out.println("inner method2:" + s + " " + "hashcode:" + s.hashCode());
}
public static void main(String[] args) {
// 示例一: 基础类型int pass by value
System.out.println("#############示例一##########");
int i = 10;
methodPassInt(i);
System.out.println("after call:" + i);
System.out.println("#############示例一##########");
// 示例二: 类类型示例一
System.out.println("#############示例二##########");
StringBuilder s = new StringBuilder("hi");
System.out.println(s.hashCode());
method1(s);
System.out.println(s);
System.out.println("#############示例二##########");
// 示例三:类类型示例二
System.out.println("#############示例三##########");
method2(s);
System.out.println(s);
System.out.println("#############示例三##########");
}
}
结果
#############示例一##########
inner method:20
after call:10
#############示例一##########
#############示例二##########
685325104
inner method1:, hello method1 hashcode:460141958
hi
#############示例二##########
#############示例三##########
inner method2:hi, method2 hashcode:685325104
hi, method2
#############示例三##########
验证一:基础类型传递方式为值传递
传递int型参数,在函数调用后原值未变,证明为值传递
验证二:类类型传递方式为值传递
若为引用传递,s应该变化,实际结果未变
验证三:类类型传递方式为值传递
- 值传递不能改变原始对象,由于传递的是对象的引用,所以不能改变此引用
- 传递的是引用,所以可以随意改变引用指向的对象