5

我有以下递归函数原型:

public void calcSim(Type<String> fort, Integer metric)
   Integer metric = 0;
   calcSim(fort, metric);
   System.out.println("metric: " + metric);
}

我想打印指标的值,如上所示。但是,它始终为零。现在,当我在函数末尾打印时,我确实得到了一个有效的数字。

  1. 如何通过引用传递或获得 C++ 中的等效功能
  2. 关于参数传递,我能做些什么?(按价值,按参考等...)
4

4 回答 4

8

Java中没有通过引用传递这样的东西,对不起:(

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

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

然后在 calcSim 中设置它metric.set(int i);

于 2012-10-19T20:27:36.997 回答
5

要获得通过引用传递的行为,您可以创建一个包装类,并在该类中设置值,例如:

class MyWrapper {
    int value;
}

然后您可以将 a 传递MyWrapper给您的方法并更改值,例如:

public void calcSim(Type<String> fort, MyWrapper metric)
   metric.value++;
   System.out.println("metric: " + metric.value);
   calcSim(fort, metric);
}
于 2012-10-19T20:26:27.273 回答
2

Integer是包装类。包装类是不可变的。所以,你所期望的不能用Integer类型来实现。

您可以围绕原语创建可变包装类并更新对象以实现您想要的。

于 2012-10-19T20:24:27.357 回答
1

两个大问题:

  1. 您也在metric方法中使用相同的名称重新定义。程序如何打印任何东西。它应该在编译时抱怨。

  2. 没有明确的退出标准。你程序(方法)停止了吗?

我想你想要一些东西(伪代码,因为我不知道你在做什么):

 public void calcSim(Type<String> fort, Integer metric)
   if(condtion){
     //print or return
   }else{
      //modify fort or metric so that it exits
      calcSim(fort, metric); //call this with modified value
      System.out.println("metric: " + metric.value);
   }
 }
于 2012-10-19T20:25:39.840 回答