繁体   English   中英

是否可以在方法中更新参考?

[英]Is it possible to update a reference in a method?

在这里问过这个问题。 我将尝试使这一点更具体。

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!"
   }
}

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

是的,可以将参数定义为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;
    }
}

注意:实际上,可以使用任何包装对象 (本身包含对A对象的引用的对象)来代替A[] A[] a就是这样一个例子。 在这种情况下, a[0]是对A对象的引用。 我只是认为使用A[]是实现此目的最简单(最直接)的方法。

正如其他Java所指出的那样,传递值是您需要的,例如C语言中的指针和对象位置地址,以便您可以修改该特定地址值。作为指针的替代方法,您可以使用数组。

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!";
   }
}

您可能只有:

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

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

不,你不能。

在Java中,所有内容均作为值传递,而不作为参考传递。

我出来了。 完全满足了我的需求,看上去也不错。

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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM