是否可以更新方法中的引用?

时间:2015-03-13 10:17:31

标签: java

我问过这个问题here。我会尝试使这个更具体。

class Example {

    public static void main(String[] args) {
        A a = null;
        load(a);
        System.out.println(a.toString());
        // outcome is null pointer exception
    }

    private static void load(A a) {
        a = new A();
    }

}

class A {
   public void String toString() {
       return "Hello, world!"
   }
}

那么,是否可以更新方法中的引用?出于某种原因,我需要这样做。原因可以在上面的链接页面上看到。

5 个答案:

答案 0 :(得分:2)

是的,如果您将参数定义为A[],即load(A[] a),然后在方法中更新该数组中位置0的元素,即a[0] = new A(),则可以。否则,由于Java是按值传递的,因此无法实现。我经常使用这种解决方法。

示例1:

class Example {

    public static void main(String[] args) {
        A[] a = new A[1];
        a[0] = new A("outer");
        System.out.println(a[0].toString());
        load(a);
        System.out.println(a[0].toString());
    }

    private static void load(A[] a) {
        a[0] = new A("inner");
    }

}

class A {

    private String name;

    public A(String nm){
        name = nm;
    }

    public String toString() {
        return "My name is: " + name;
    }
}

示例2:

class Example {

    public static void main(String[] args) {
        A[] a = new A[1];
        a[0] = null; // not needed, it is null anyway 
        load(a);
        System.out.println(a[0].toString());
    }

    private static void load(A[] a) {
        a[0] = new A("inner");
    }

}

class A {

    private String name;

    public A(String nm){
        name = nm;
    }

    public String toString() {
        return "My name is: " + name;
    }
}

注意:实际上,您可以使用任何包装器对象(一个自身包含对{{1的引用)的对象,而不是A[]。对象)。 A只是一个这样的例子。在这种情况下,A[] a是对a[0]对象的引用。我只是认为使用A是实现这一目标的最简单(最直接)的方法。

答案 1 :(得分:1)

正如其他java已经指出的那样,pass-by-value。你需要像C中的指针一样使用对象位置地址,以便你可以修改那个特定的地址值。作为指针的替代,你可以使用array.Example < / p>

class Example {

    public static void main(String[] args) {

        A[] aArray=new A[1];

        load(aArray);
        System.out.println(aArray[0].toString());
        // outcome is Hello, world!
    }

    private static void load(A[] aArray2) {
        aArray2[0] = new A();
    }

}

class A {
   public String toString() {
       return "Hello, world!";
   }
}

答案 2 :(得分:0)

你可以:

public static void main(String[] args) {
    A a = load();
}

private static A load() {
    return new A();
}

答案 3 :(得分:0)

不,你不能

在java中,所有内容都作为值而不是引用传递。

答案 4 :(得分:0)

我出来了。完全满足我的需求,看起来很不错。

class A {

    private A reference;

    private String name;

    public A() {
        reference = this;
    }

    public void setReference(A ref) {
        reference = ref;
    }

    public void setName(String name) {
        reference.name = name;
    }

    public String getName() {
        return reference.name;
    }

}