传递对象引用,未获得预期结果。

时间:2012-08-22 18:35:06

标签: java object static

传递对象引用到静态方法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());
        }
    }

3 个答案:

答案 0 :(得分:1)

Java是pass by value(特别是链接中的第二个答案)

I i的{​​{1}}范围仅限于方法i

在执行中它看起来像:

m1

答案 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