我知道Java不支持通过引用传递。但是,如果不是像在C / C ++中那样直接实现,还有可能以任何其他方式实现它吗?
答案 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;
}
这可以使用吗?不,仅在特定用例中。