当前位置: 首页 > 知识库问答 >
问题:

作为递归方法参数的变量是如何处理的?

田谦
2023-03-14

我想计算我的xhtml页面上的所有元素。我希望每个下一个元素都以更大的顺序放入HashMap中。

private void addComponents(HashMap信息、列表组件、整数顺序、FacesContext上下文){

  System.out.println("Start: "+order);

  if ((components == null) || components.isEmpty())
  {
      System.out.println("return: "+order);
      return;
  }
  order = order + 1000;
  for (UIComponent c : components) {
      System.out.println("HashMap: "+order);
      infos.put(c.getClientId(context), order);
      addComponents(infos, c.getChildren(), order, context);
      System.out.println("Out: "+order);
      order = order + 1000;
  }
  System.out.println("End: "+order);
  return;

}

我有作为输出和错误的数字

HashMap: 1000

Start: 1000

return: 1000

Out: 1000

HashMap: 2000

Start: 2000

return: 2000

Out: 2000

HashMap: 3000

Start: 3000

HashMap: 4000

Start: 4000

return: 4000

Out: 4000

HashMap: 5000

Start: 5000

return: 5000
Out: 5000
HashMap: 6000

Start: 6000

return: 6000

Out: 6000

End: 7000

Out: 3000

HashMap: 4000
  for (UIComponent c : components) {

          order = order + 1000;
          infos.put(c.getClientId(context), order);

      order = addComponents(infos, c.getChildren(), order, context);

  }
  return order;

为什么这两种方法的作用不同?

共有1个答案

沈华皓
2023-03-14

您必须记住,Java中的参数赋值不会影响那个调用方法。因此,当您执行order=order+1000时,这不会影响AddComponents的调用实例中order的值。通过返回值,您允许调用方将其值更新为递归调用的值。

解决这一问题的一个方法是使用字段,但是如果您是多线程的,那么您可能会遇到线程安全问题。

 类似资料:
  • 问题内容: 我正在用JavaScript准备一些变量(在我的特定情况下,我想获取GPS位置): 我想通过下面的命令按钮将它们发送到我的托管bean: 如何将JavaScript中的变量和变量发送到JSF托管bean操作方法? 问题答案: 让JS以相同的形式将它们设置为隐藏的输入值。 命令按钮操作方法可以按通常方式将它们作为bean属性进行访问。

  • 我想通过下面的命令按钮将它们发送到我的托管bean: 我如何将和变量从JavaScript发送到JSF托管bean动作方法?

  • 本文向大家介绍Java中final作用于变量、参数、方法及类该如何处理,包括了Java中final作用于变量、参数、方法及类该如何处理的使用技巧和注意事项,需要的朋友参考一下 Java中方法用final修饰参数的作用 在方法参数前面加final关键字就是为了防止数据在方法体重被修改。 主要分为两种情况:第一,用final修饰基本数据类型;第二,用final修饰引用数据类型。 第一种情况,修饰基本数

  • 从性能还是从其他因素来看,哪一种方法更好? 假设我正在创建一个类,其中有一个方法,它接受2个值并将它们相加在一起。 是有两个实例变量来存储两个值,然后有一个方法来使用这些值更好,还是在调用方法时将变量作为参数传入更好? 或者仅仅使用静态方法更好,这样我就不需要在每次使用该方法时创建对象了?

  • 组件具有变量作为观察者: 当

  • 该方法的规范声称,该方法,从根开始,将移除最左侧的节点,并修复树结构。它还指出,如果最左侧节点没有左子节点,则将右子节点(可能为)作为左子节点附加到最左侧节点的父节点(我在代码中看不到这种情况发生的地方)。代码如下: 我只是不明白它是如何返回整个树和返回最左边的节点。主要是第一部分让我感到困惑,它说如果返回右边的子项。如果我深入到树中(由于递归调用),返回右不就会切断树的很多部分吗?