传递对象引用到静态方法m1()为什么它不变为null,为什么最后一个语句不给出错误。输出为X
class I {
private String name;
public String name() {
return name;
}
public I (String s) {
name = s;
}
}
class J {
public static void m1 (I i){
i = null;
}
public static void main (String[] arg)
{
I i = new I("X");
m1(i);
System.out.print(i.name());
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
Java是按值传递的,因此i
的范围仅限于m1()
public static void m1 (I i){ // i is copied from i which is in main method but it is another variable whose scope lies within m1() only
i = null; // original i in main lies in main() method scope
}
如果在方法m1()中更改i
的名称,则混淆将更像:
public static void m1 (I iObj){
iObj = null; // i in main() method still points to Object
}
答案 2 :(得分:1)
Java仅使用按值传递。仅更改i
中m1
的值会更改该参数的值。它不会对i
中的变量main
进行任何。
可能让您感到困惑的是 - 它确实让很多其他人感到困惑 - 尽管参数是通过值传递的,但如果参数的类型是类,则该值是引用。 ..实际上每种情况下i
变量的值都是一个参考。该引用仍然按值传递 - 参数的值直接复制为参数的初始值。但是,如果不是更改参数本身而是对参数值引用的对象进行更改,那么这是另一回事:
void foo(StringBuilder builder) {
builder.append("Hello");
}
void bar() {
StringBuilder x = new StringBuilder();
foo(x);
System.out.println(x); // Prints Hello
}
有关详细信息,请参阅Java tutorial on passing information to a method or constructor。