代码之家  ›  专栏  ›  技术社区  ›  Nishant Bhardwaz

按值调用对象引用未按预期工作

  •  0
  • Nishant Bhardwaz  · 技术社区  · 3 年前

    nodeDepths(root, depth, depthSum) 并期望中的更新值 depthSum 但每次它把0还给我

    public static int nodeDepths(BinaryTree root) {
                Integer depthSum = 0;
                Integer depth = 0;
                nodeDepths(root, depth, depthSum);
                return depthSum;
        
            }
        
            public static void nodeDepths(BinaryTree root, int depth, Integer depthSum) {
                depth = depth + 1;
                depthSum = depthSum + depth;
        
                if (root.left == null && root.right == null) {
                    return;
                }
        
                nodeDepths(root.left, depth, depthSum);
        
                nodeDepths(root.right, depth, depthSum);
        
            }
    

    我没有提到问题场景和逻辑部分,因为这不是一个问题。我面临的问题是 “调用方方法中未更新depthSum引用变量”

    1 回复  |  直到 3 年前
        1
  •  0
  •   Amadan    3 年前

    你的台词

    depthSum = depthSum + 1
    

    depthSum 对象,但本地 深度总和 变量。与任何局部变量更新一样,它不会传播到调用者,因为调用者只知道原始绑定,这就是为什么此调用策略是按值调用的子类型(其中值是对对象的引用)。

    为了做你想做的事,你需要做如下的事情

    depthSum.increment()
    depthSum.add(1)
    depthSum.setValue(depthSum.valueOf() + 1)
    

    但不幸的是 Integer 是不可变的,并且不存在这样的方法。不可能使用对象共享调用策略来更新 .