【问题标题】:I'm having trouble grasping how to pass variables to and from methods我无法掌握如何在方法之间传递变量
【发布时间】:2012-03-31 07:31:49
【问题描述】:

我来自过程编程背景,需要一些帮助来掌握方法如何来回传递变量。这些方法适用于显式声明的值,但是当我尝试将值从一种方法传递给另一种方法时,我会收到各种“错误:找不到符号”消息。

我怀疑我要么 a.) 在错误的位置声明变量并且在方法结束时清除它们,要么 b.) 我如何编码变量的发送/返回是错误的,或者 c 。) 两个都。更重要的是,虽然我已经阅读了我的教科书和一些在线教程资源,但我仍然无法理解语法应该如何工作。有人能帮我介绍一下吗?

程序:在提供的代码中,我尝试掷五个六面骰子。一种方法掷一个骰子,另一种方法多次调用该方法并将值写入数组......我想。

提前致谢,

public class FiveDice
{
// MAIN METHOD
   public static void main(String[] args)
   {
// SET VARIABLES FOR DIE HIGH AND LOW VALUES, NUMBER OF DICE TO ROLL
      final int LOWEST_DIE_VALUE = 1;
      final int HIGHEST_DIE_VALUE = 6;
      final int DICE_TO_ROLL = 5;
// ROLL A SINGLE DIE VIA METHOD rollADie()
          int roll = rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE);
      System.out.println("roll  " + roll);
    }
//
// RETURNS THE RESULT OF A SINGLE DIE ROLL
    public static int rollADie(int HIGHEST_DIE_VALUE,int LOWEST_DIE_VALUE)
    {
        int roll;
        roll = ((int)(Math.random()*100)%HIGHEST_DIE_VALUE+LOWEST_DIE_VALUE);
        return roll;
    }
//
// CALL rollADie TO ROLL DICE_TO_ROLL (above) DICE; RETURN ARRAY OF ROLLED DICE
    public static int[] rollTheDice(int DICE_TO_ROLL, int HIGHEST_DIE_VALUE,int LOWEST_DIE_VALUE)
    {
            int rollNum;
        int rolledDie;
                for(rollNum=1;rollNum<=DICE_TO_ROLL;rollNum++)
                {
        int[] rolledDie = new rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE)
        {
           rolledDie
        };
        return rolledDie[];
            }
      }

   } 

【问题讨论】:

  • 你能用两句话问你的问题吗?到时候肯定会有人看的。
  • 您有一个简单而具体的问题吗?
  • 这里的代码实际上只是程序性的——你认为你在做什么不同?
  • 废话。我〜想〜我的方法是创建一个代表单个掷骰子的对象和另一个代表多个掷骰子的对象。我想我没有尽可能地掌握 OO...关于我缺少什么的建议?

标签: java variables methods parameter-passing


【解决方案1】:

说实话,这完全是一团糟(但我们都是新人,对吧)?您真正需要做的只是阅读有关编写 Java 应用程序的教程,尤其是面向对象的概念,然后边做边学。基本的面向对象概念,即方法表示它们所附加的对象的动作/能力,而不是作为大多数独立函数/子例程的列表,将真正帮助您了解 OO 编程与函数式编程的不同之处.

我会逐节介绍并尝试在这里为您提供帮助。

第 1 节:

// MAIN METHOD
public static void main(String[] args)
{
  // SET VARIABLES FOR DIE HIGH AND LOW VALUES, NUMBER OF DICE TO ROLL
  final int LOWEST_DIE_VALUE = 1;
  final int HIGHEST_DIE_VALUE = 6;
  final int DICE_TO_ROLL = 5;

  // ROLL A SINGLE DIE VIA METHOD rollADie()
  int roll = rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE);
  System.out.println("roll  " + roll);
}

好的,所以你有一个 main 方法。好的开始。所有 Java 应用程序都需要这个。然而:

  • 您在 main 方法中声明 final 变量,这并不是必需的。删除此处的 final 关键字,将变量名重新大写为 camelCase 约定,然后将它们作为普通变量传递。
  • 另外,这只是一个风格点,您要声明lowestDieValue,然后是highestDieValue,这完全有道理,但是您首先将它们传递给最高,然后是最低。这感觉有点奇怪和不一致,所以我把它们翻过来了。
  • 最后,也没有理由将您的 cmets 全部大写,所以作为另一个风格点,我会使用正常大小写。但是,在您的代码中,我认为您的变量和方法名称具有足够的描述性;你真的根本不需要cmets,所以我把它们拿出来了。

所以第 1 部分,经过这些更改后,应该如下所示:

public static void main(String[] args) {
  int lowestDieValue = 1;
  int highestDieValue = 6;
  int diceToRoll = 5;

  int roll = rollADie(lowestDieValue, highestDieValue);
  System.out.println("roll  " + roll);
}

第 2 部分:

  • 如上所述重新排序变量名称,并且不要使用全部大写 - 按照惯例,所有大写都保留给常量(即final 变量)。当你将它传递给一个方法时,它们不是final/constants。
  • 此方法过于冗长。它只做了一件有用的事情,因此可以只写一行。

当您进行这些更改时,第 2 部分应如下所示:

public static int rollADie(int lowestDieValue, int highestDieValue) {
  return ((int)(Math.random()*100)%highestDieValue+lowestDieValue);
}

第 3 部分:

这种方法可以大大简化。我们基本上试图完成三件事:

  1. 创建一个数组来存储掷出的骰子值
  2. 循环通过掷骰子获取值,将每个创建的值存储在数组中
  3. 返回结果int[](整数数组)

您在此方法中遇到了几个问题,包括在 for 循环中间调用 return 语句(这是可编译的,但在您的情况下技术上不正确,因为它会导致您的方法提前返回数组中只有一个值)。

我将完全重写此方法,包括根据上述约定重命名/重新大写变量名。重写干净地完成了这个方法需要做的三件事(如上所述):

public static int[] rollTheDice(int numDiceToRoll, int lowestDieValue, int highestDieValue) {
  int[] allDiceRolls = new int[numDiceToRoll];

  for(int i = 0; i < allDiceRolls.length; i++) {
    allDiceRolls[i] = rollADie(lowestDieValue, highestDieValue);
  }

  return allDiceRolls;
}

最后:

  • 风格:我一直习惯于将开头的{ 放在一行的末尾,而不是放在他们自己的一行上,但这只是一种风格。任何一种样式都是有效的,并且在编译时具有相同的含义。
  • 代码:您的类名为“FiveDice”,但您实际上并未在 main 方法中掷 5 个骰子,也从未调用过 rollTheDice 方法。

【讨论】:

  • 在我进行的过程中做了几次修改。我认为它现在是完全一致和正确的。祝 Java 好运!
  • 在第 3 部分,for(int i = 0; i &lt; allDiceRolls.length; i++)length 是一个字符串函数,我希望它返回一个表示字符串长度的 int。 allDiceRolls 然而,已经是一个整数。我的假设是因为数组中有numDiceToRoll,所以allDiceRollslength 是该变量的内存预留实例的计数。那是对的吗?还是存储在数组中的字节数(例如,0-9 是 10 个字节,0-10 是 12 个字节)?我无法找到此方法的非字符串应用程序的文档。谢谢!
  • 当在数组上使用时,就像在这种情况下,'length' 返回一个整数,表示数组中“槽”的数量。所以,如果你声明 'int[] array = int[5];'那么'array.length'将返回整数值'5'
  • 好消息!非常感谢!您的回答非常完整且内容丰富。感谢!
【解决方案2】:
int newVariable = return methodFromWhichDataIsReturned(fieldReturnedFromMethod);

关键字return 不能放在那里。表示要退出当前正在执行的方法,所以只能放在行首,比如return 3;当你调用有返回值的方法时,不需要放在@987654324 @ 在前。换句话说,它应该是:

int newVariable = return methodFromWhichDataIsReturned(fieldReturnedFromMethod);

rollTheDice 方法更可能写成:

int rollNum;
int[] rolledDie = new int[DICE_TO_ROLL];
for (rollNum = 1; rollNum <= DICE_TO_ROLL; rollNum++) {
    rolledDie[rollNum - 1] = rollADie(HIGHEST_DIE_VALUE, LOWEST_DIE_VALUE);
}
return rolledDie;

在上面的第二行中,我们正在创建一个包含 DICE_TO_ROll 个元素的新数组。这个数组有整数,每个整数默认为 0。我们现在要掷骰子,每次 rollADie 计算出一个值,我们将把它存储在 rollADie 的位置 rollNum - 1(因为数组从 0 开始,所以第一个元素在 rolledDie[0])。在最后一行,我们从这个方法返回数组。

最后,在各种语言中,将常量名称以大写字母写成惯例,将常规变量的名称以大写字母写成其他形式。例如下面这行:

public static int rollADie(int HIGHEST_DIE_VALUE,int LOWEST_DIE_VALUE)

通常会写成:

public static int rollADie(int highestDieValue, int lowestDieValue)

或:

public static int rollADie(int highest_die_value, int lowest_die_value)

【讨论】:

    【解决方案3】:

    This 是一个很好的地方,可以开始学习来自其他语言的 java 类和方法如何工作。具体来说,您似乎无法理解一些面向对象的概念,在这种情况下,我建议您阅读these

    看看你的代码,你在这里正确地调用了 rollADie:

    int roll = rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE);

    但是在这里你尝试像一个不起作用的类一样实例化它:

    for(rollNum=1;rollNum<=DICE_TO_ROLL;rollNum++)
    {
        int[] rolledDie = new rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE)
        {
           rolledDie
        };
        return rolledDie[];
    }
    

    尝试用这个替换第二个块:

    int[] rolledDiceValues;
    for(rollNum=1;rollNum<=DICE_TO_ROLL;rollNum++)
    {
        rolledDiceValues[rollNum] = rollADie(HIGHEST_DIE_VALUE,LOWEST_DIE_VALUE);
    }
    return rolledDiceValues;
    

    您必须等待 for 循环完成迭代,然后才能返回填充了已完成的骰子卷的数组。

    【讨论】:

    • 感谢负载。这有帮助。当我〜看到〜它时,我可以说出它为什么有意义,以及我在哪里搞砸了。问题是我理解 OO 的概念思想,但将其转化为工作代码……这完全是另一回事。 :) 我会重新访问 javadoc 并再玩一些。
    【解决方案4】:

    我无法查看您的代码,因为它不完全是特定的 sn-p 代码……阅读和梳理它需要时间。

    我将尝试解决您的主要问题 - 传递变量。我一直认为编程函数是数学函数,从某种意义上说,我传递给方法的值都会被使用。

    作为一个例子:我有一个方法 f(x) = 2x2-3x+7。 x 显然绑定到了这个函数的作用域。

    如果我有一个变量 y = 17,并且我用 x = y 调用我的方法,那么值 17 将用于x 在 f(x) 中的位置。


    对于 Java,它并没有太大的不同。您传递一个值(具有 API 中描述的类型或您自己指定的类型),然后期望一个结果(或 void,如果返回类型为 void)。以您的代码为例...

    public static int rollADie(int HIGHEST_DIE_VALUE,int LOWEST_DIE_VALUE)
        {
            int roll;
            roll = ((int)(Math.random()*100)%HIGHEST_DIE_VALUE+LOWEST_DIE_VALUE);
            return roll;
        }
    

    ...如果我用两个 int 变量 var1=15var2=17 调用这个方法,它看起来像这样。

    int myRoll = rollADie(var1, var2);
    

    当我们将变量传递给函数时,我们所做的是接受我们在签名中使用的变量(在此示例中,HIGHEST_DIE_VALUELOWEST_DIE_VALUE)绑定到特定于 范围的rollADie。这意味着这两个变量在方法之外没有意义,除了它们的类型。

    【讨论】:

    • 是的......函数总是鞭打我在学校的**。 :) 但我明白你在说什么。这有助于很好地构建它。谢谢!
    【解决方案5】:

    函数有一个返回类型,这就是它们返回的内容。 他们只能有一个回报。一旦函数返回,它的执行就结束了。

    公共 int foo()
    {
    返回 1;
    }

    公共 int bar()
    {
    返回 1;
    // 这里没有代码会执行
    }

    要设置一个值,比如 int myInt 类型:

    int myInt = foo(); // 没有理由返回这里。如果一个函数有返回值,它无论如何都会返回它。

    【讨论】:

    • 所以如果我没看错的话 int myInt = foo();实际上是在获取从 public int foo() 返回的 1 ...?这是对正在发生的事情的准确理解吗?
    【解决方案6】:

    您是否尝试过阅读有关 java 的内容,例如查看一些可用的教程:

    http://docs.oracle.com/javase/tutorial/java/index.html

    【讨论】:

    • 我有。具体来说,我已经广泛地查看了类和对象部分......它只是没有意义。这几乎就像指代多边形一样,对示例的兴趣让我的大脑关闭......
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2021-01-23
    • 2018-08-08
    • 1970-01-01
    • 2014-07-13
    • 2012-03-20
    相关资源
    最近更新 更多