1

关于将对象引用传递给静态方法 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());
        }
    }
4

3 回答 3

1

Java 是按值传递的(专门阅读链接中的第二个答案)

I i范围i仅限于方法m1

在执行中,它看起来像:

`I i` in `m1()` points to `null` reference

I i method reference still points to `new I("X");`
于 2012-08-22T18:36:25.923 回答
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

}

如果您i在方法 m1() 中更改名称,混淆会减少,例如:

public static void m1 (I iObj){ 
    iObj = null;  // i in main() method still points to Object

}
于 2012-08-22T18:37:40.050 回答
1

Java 仅使用按值传递。更改iwithin的值m1 只会更改该参数的值。它对内的变量没有任何作用。imain

可能会让你感到困惑的——它肯定会让很多其他人感到困惑——虽然参数是按值传递的,但如果参数的类型是一个类,那么那个值就是一个引用……实际上i变量的值是每个案例都是一个参考。该引用仍然按值传递 - 参数的值直接复制为参数的初始值。但是,如果不是更改参数本身,而是更改参数值所指的对象,那就是另一回事了:

void foo(StringBuilder builder) {
    builder.append("Hello");
}

void bar() {
    StringBuilder x = new StringBuilder();
    foo(x);
    System.out.println(x); // Prints Hello
}

有关更多详细信息,请参阅有关将信息传递给方法或构造函数的 Java 教程

于 2012-08-22T18:38:00.580 回答