如何在Java中显式实现按引用传递?

时间:2018-10-25 08:40:52

标签: java pass-by-reference

我知道Java不支持通过引用传递。但是,如果不是像在C / C ++中那样直接实现,还有可能以任何其他方式实现它吗?

3 个答案:

答案 0 :(得分:3)

不。你做不到这不是您可以“实现”的东西。这是该语言的基本方面。

答案 1 :(得分:0)

如果 ,您要尝试的是对可以传递的原始值进行“引用”,以便可以在内部修改原始值方法,并在上述方法之外显示更改...

...只需传递一个包含原语的数组,就像这样:

int a[10][20][30] = {0};
int (*d)[20][30] = a;
int (*e)[20][30] = a+1;
printf("%ld", (long)(e-d));

请记住,这不是“通过引用”。 Java未传递对值的引用,Java正在传递数组的引用的值。
您可以阅读Is Java "pass-by-reference" or "pass-by-value"?,以对此进行更好的讨论。

答案 2 :(得分:0)

传递值是设计使然的:f(x)可能会更改x的内部值,但是x不会获得另一个值。 _例如,您无法使用f的形式参数将f赋给x中的null。

可能存在输入-输出参数,这在Java中可以通过函数的结果来完成:

insertInNodes是这样的方法。

public class SortedLinkedList<T extends Comparable<T>> {
    private static class Node { ... }
    Node head;
    int size;

    public void insert(T data) {
        head = insertInNodes(head, data);
    }

    private Node insertInNodes(Node node, T data) {
        if (node == null || data.compareTo(node.data) < 0) {
            ++size;
            return new Node(data, node);
        }
        if (data.compareTo(node.data) > 0) {
            node.next = insertInNodes(node.next, data);
        }
        return node;
    }
}

传递引用需要伪造:传递容器对象,然后该组件实际上是引用。例如,具有一个元素的数组或类似Atomic<String>的包装类。

通过引用传递可以通过传递所需的“变量”的获取器和设置器来实现。

    public void insert(T data) {
        insertInNodes(this::getHead, this::setHead, data);
        // Or insertInNodes(() -> head, (n) -> head = n, data);
    }

    private void insertInNodes(Supplier<Node> getter, Consumer<Node> setter, T data) {
        if (getter.get() == null || data.compareTo(getter.get().data) < 0) {
            ++size;
            setter.apply(new Node(data, getter.get()));
        }
        if (data.compareTo(node.data) > 0) {
            // insertInNodes(() -> node.next, (n) -> node.next = n, data);
            // or
            insertInNodes(node::setNext, node::getNext, data);
        }
        return node;
    }

这可以使用吗?不,仅在特定用例中。