Java 按引用传递和递归

Java 按引用传递和递归,java,methods,parameters,parameter-passing,Java,Methods,Parameters,Parameter Passing,我有以下递归函数原型: public void calcSim(Type<String> fort, Integer metric) Integer metric = 0; calcSim(fort, metric); System.out.println("metric: " + metric); } public void calcSim(fort类型,整数度量) 整数度量=0; calcSim(福特,公制); System.out.println(“公制:“

我有以下递归函数原型:

public void calcSim(Type<String> fort, Integer metric)
   Integer metric = 0;
   calcSim(fort, metric);
   System.out.println("metric: " + metric);
}
public void calcSim(fort类型,整数度量)
整数度量=0;
calcSim(福特,公制);
System.out.println(“公制:“+公制”);
}
我想打印如上所示的度量值。然而,它总是零。现在,当我在函数末尾打印时,我得到了一个有效的数字

  • 如何通过引用传递或获得与C中相同的功能++
  • 关于参数传递,我能做些什么?(按价值、参照等)

  • Integer
    是包装类。包装类是不可变的。因此,使用
    Integer
    type无法实现您的期望


    您可以围绕原语创建可变包装器类,并更新对象以实现所需目标。

    两个大问题:

  • 在方法中,您正在使用相同的名称重新定义度量。程序如何打印任何东西。它应该在编译时抱怨

  • 没有定义退出标准。您是否编程(方法)停止

  • 我想您想要的是(伪代码,因为我不知道您在做什么):

    public void calcSim(fort类型,整数度量)
    如果(条件){
    //打印或返回
    }否则{
    //修改fort或metric,使其退出
    calcSim(fort,metric);//使用修改后的值调用它
    System.out.println(“公制:“+公制值”);
    }
    }
    
    要获得通过引用传递的行为,您可以创建一个包装类,并在该类中设置值,例如:

    class MyWrapper {
        int value;
    }
    
    然后可以将
    MyWrapper
    传递给方法并更改值,例如:

    public void calcSim(Type<String> fort, MyWrapper metric)
       metric.value++;
       System.out.println("metric: " + metric.value);
       calcSim(fort, metric);
    }
    
    public void calcSim(类型fort,MyWrapper metric)
    度量值++;
    System.out.println(“公制:“+公制值”);
    calcSim(福特,公制);
    }
    
    Java中没有“按引用传递”这样的东西,很抱歉:(

    您可以选择为该方法提供一个返回值,或者使用可变包装器并在运行时设置该值。使用AtmoicInteger,因为它在JDK中,使您自己的方法不担心线程安全,当然会稍微快一些

    AtomicInteger metric = new AtomicInteger(0);
    calcSim(fort, metric);
    System.out.println("metric: " + metric.get());
    

    然后在calcSim内部使用
    metric.set(int i);

    ,请。您永远不会更改
    metric
    的值,因此它总是打印
    0
    @pst:谢谢您的更正。注释已删除。让
    calcSim
    返回结果,而不是尝试在适当的位置修改它。
    AtomicInteger metric = new AtomicInteger(0);
    calcSim(fort, metric);
    System.out.println("metric: " + metric.get());