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



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

不。你做不到。这不是你可以"实现"的东西。这是语言的一个基本方面。

如果你 要做的是对一个可以传递的基元值的"引用",那么你可以在方法内部修改基元的值,并使更改在所述方法之外可见......

。只需传递一个包含基元的数组,如下所示:

// 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 传递的是数组引用的值。
你可以阅读Java是"按引用传递"还是"按值传递"?,以获得更好的讨论。

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

有可能通过函数的结果来完成 java 中的in-out 参数

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>.

更纯粹形式的逐个引用传递可以通过传递所需"变量"的 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;
}

这可用吗?否,仅在特定用例中。

最新更新