修改传递给函数的实际变量

Modify the actual variable passed to a function

提问人:rohit 提问时间:4/20/2022 最后编辑:rohit 更新时间:4/20/2022 访问量:90

问:

我有以下代码来重新分配函数中的变量。但这在 main 函数中是不可见的。这可能是因为要重新分配的是本地副本。原始内存位置保持不变。ll1balance

我怎样才能修改它以便修改实际内容?ll1

public static void main(String[] args) {
   Node ll2 = new Node();
   Node ll1 = new Node();
   balance(ll1,ll2);
}
private static void balance(Node ll1, Node ll2) {
   int size1=size(ll1);
   int size2=size(ll2);
   if(size1==size2){

   } else if(size1>size2){
       // add size1-size2 zeros as prefix to ll2
       ll2=addNodes(ll2,size1-size2);

   } else if(size1<size2){
       // add size2-size1 zeros as pre
    ll1=addNodes(ll1,size2-size1);
   }
}

private static Node addNodes(Node node, int num) {
    int count = 0;
    Node node1 = null;
    Node node2 = node;
    while (count < num) {
        node1 = new Node();
        node1.value = 0;
        node1.next = node2;
        node2 = node1;
        count++;
    }
    return node1;
}
Java 参数传递 by-reference

评论

0赞 Dave Newton 4/20/2022
您将本地引用与引用对象混淆了。您可以随心所欲地修改本地引用的内容,但需要注意的是,这样做可能会造成混淆。请注意,除了将每个新节点设置为传入的节点之外,这并没有真正按照您的想法进行操作,这似乎是不正确的。可能值得退后一步,跟踪你的代码(a)实际在做什么,(b)确保你了解它应该做什么。addNodesnext
0赞 rohit 4/20/2022
@DaveNewton,是的,你是对的。我会检查的。我想在前缀中添加一些零
0赞 XtremeBaumer 4/20/2022
Node nll2 = new Node(); Node nll1 = new Node(); balance(ll1,ll2);调用不会编译,因为没有带有名称的变量,并且不存在balance(ll1,ll2);ll1ll2
0赞 vsfDawg 4/20/2022
您是否正在尝试实现单个链接列表?

答:

1赞 aleck099 4/20/2022 #1

函数参数传递是单向操作,这意味着您无法编辑传递给您的参数

但是,当您需要编辑的内容不在参数列表中时,这成为可能

例如,创建一个包装类:

public class NodePair {
  public final Node n1;
  public final Node n2;
  public NodePair(Node a, Node b) { n1 = a; n2 = b; }
}

当它传递给你时,你不能修改该对,但你可以通过该对修改 n1 和 n2

评论

0赞 rohit 4/20/2022
是的,这行得通。这是唯一的方法,还是有更好的方法。为这么简单的事情制作一个特殊的包装类感觉有点奇怪
0赞 aleck099 4/22/2022
@rohit 更好的方法是不要让函数修改局部变量。在 java 中不推荐使用
0赞 aleck099 4/22/2022
@rohit 另一种方式:如果通过包装对象传递基本类型(如而不是),则实际上是在传递其引用,因此可以在函数中修改它。这不适用于某些“最终”对象(例如,您永远不能编辑一个,而是重新创建一个)IntegerintStringString