分析java 函数参数传递的类型.
首先看示例:
//定义一个受测试的类
public static class Value {
private String value = "value";
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
//定义对受测试类的 操作方法
public static void newValue(Value value) {
value = new Value();
value.setValue("new value");
System.out.println("In newValue, HashCode = "
+ value.hashCode() + ", value = " + value.getValue());
}
//定义对受测试类的 操作方法
public static void modifyValue(Value value) {
value.setValue("new value");
System.out.println("In modifyValue, HashCode = "
+ value.hashCode() + ", value = " + value.getValue());
}
//测试
public static void main(String[] args) {
Value value1 = new Value();
System.out.println("Before modify, HashCode = "
+ value1.hashCode() + ", value = " + value1.getValue()); //1. Before modify,
//HashCode = 12677476, value = value
// 将value1指向新的Value对象
//[分析点1]
newValue(value1); //1. In newValue, HashCode = 33263331, value = new value
System.out.println("After modify, HashCode = "
+ value1.hashCode() + ", value = " + value1.getValue() + "\n"); //1. After modify,
//HashCode = 12677476, value = value
Value value2 = new Value();
System.out.println("Before modify, HashCode = "
+ value2.hashCode() + ", value = " + value2.getValue());//1. Before modify, HashCode = 6413875, value = value
// 使用object的set方法,修改对象的内部值
//[分析点2]
modifyValue(value2); //In modifyValue, HashCode = 6413875, value = new value
System.out.println("After modify, HashCode = "
+ value2.hashCode() + ", value = " + value2.getValue()); //1. After modify, HashCode = 6413875, value = new value
}
分析:
[分析点1] 处调用下面函数时的参数传递分析:
newValue(value1); //1. In newValue, HashCode = 33263331, value = new value
//定义对受测试类的 操作方法
public static void newValue(Value value) {
/*
此时 函数内的局部变量 value引用的是value1,
相当于c语言中 value是一个指向Value类型的一个指针:
Value * value;
而之前new 建立的value1 相当于c语言中:
Value * value1 = new Value();
value 是在栈内存中重新分配的一个指针型变量,该指针指向 value1指向的对象.
*/
value = new Value(); //重置 value指针,指向一个新的对象, 此时value和value1分别指向不同的对象了.
value.setValue("new value");
System.out.println("In newValue, HashCode = "
+ value.hashCode() + ", value = " + value.getValue());
}
画图个草图:
结论:
有一种说法是当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象
的引用,因此JAVA 中只有值传递,没有引用传递。
还有一种说法是引用可以看作是对象的
别名,当对象被当作参数传递给方法时,传递的是对象的引用,因此是引用传递
这种说法只是观察的角度不同,实质是相同的.