【问题标题】:How to implement pass by reference in java explicitly?如何在java中显式地实现引用传递?
【发布时间】:2018-10-25 08:40:51
【问题描述】:

我知道 java 不支持按引用传递。但是,如果不是直接在 C/C++ 中,是否还有可能以任何其他方式实现它?

【问题讨论】:

  • 你到底想做什么?不管是什么,都可能有办法做到这一点。
  • Java 对对象使用按引用传递,对基元使用按值传递,但不知道是否有办法使其明确。
  • @SBylemans 没有。 Java 按值传递引用。这与 C++ 中的引用传递不同
  • c 没有通过引用。您可以执行类似 `void method(ArgClass[] arg) 的操作,然后您可以分配 arg[0] = ...,它的行为更像是指针/引用。
  • “我知道做不到,但我还是想做”。那里有疯狂和永恒的眼泪。

标签: java pass-by-reference


【解决方案1】:

不。你不能这样做。这不是你可以“实施”的东西。这是语言的一个基本方面。

【讨论】:

  • 我认为你没有理解我的问题!
【解决方案2】:

如果您尝试做的是对可以传递的原始值进行“引用”,因此您可以在其中修改原始值方法并让更改在所述方法之外可见...

...只需传递一个包含原语的数组,如下所示:

// By value
int value = 1;
changeValue(value); // changes value to 5
System.out.println(value); // prints 1

// By "reference"
int[] reference = {1};
changeValue(reference); // changes value inside "reference" to 5
System.out.println(reference[0]); // prints 5

// Methods
void changeValue(int value) { value = 5; }
void changeValue(int[] reference) { reference[0] = 5; }

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

【讨论】:

  • 嘿!现在我能理解了!
  • 很高兴我能帮助你 :) 请记得投票/接受你认为有用的答案(我的或其他人的),以便人们继续回答^^
【解决方案3】:

按值传递 是设计使然:f(x) 可能会改变 x 值的内部结构,但 x 不会获得另一个值。 _例如,您不能使用 f 的形式参数将 null 分配给 f 内部的 x。

in-out parameters有可能在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&lt;String&gt;。

通过引用传递可以通过传递所需“变量”的getter和setter来实现。

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

这个有用吗?不,仅在特定用例中。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2014-06-12
    • 1970-01-01
    • 2021-11-28
    • 2017-04-26
    相关资源
    最近更新 更多