java - 从另一个方法传递变量值

标签 java variables methods parameter-passing

我已经解决这个问题几个小时了,并且取得了重大进展(这在很大程度上要归功于搜索该站点并应用在类似问题中找到的提示),但我现在似乎陷入了僵局。请看一下我所做的,要么指出我哪里出错并提供伪代码来更正,要么为我指出可以帮助我填补理解空白的资源。我真的觉得好像我只是遗漏了一个微小的细节,这些细节将使这个主题对我来说有意义。

该应用程序的目的是根据用户输入的 2 个分子和 2 个分母来加、减、乘和除分数(是的,这是针对类(class)作业的,所以请不要提供源代码,而是提供有关我在概念上出错的地方)。我将其分解为几个步骤,第一步是获取用户的输入并将其输出以供确认。

方法文件:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    // Declare integer class variables for package Fractions
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    // Obtain four integers from user input and output to console as two fractions
    public static void getFractions(int fracNum1, int fracDenom1, int fracNum2, int fracDenom2)
    {
        Scanner inInt = new Scanner(System.in);

        System.out.println("Enter an integer for the numerator of the first " +
                                    "fraction:  ");
            fracNum1 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator of the first " +
                                    "fraction:  ");
            fracDenom1 = inInt.nextInt();

        System.out.println("Enter an integer for the numerator of the second " +
                                    "fraction:  ");
            fracNum2 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator fo the second " +
                                    "fraction:  ");
            fracDenom2 = inInt.nextInt();
        System.out.println("===================================================" +
                                    "=================");
    }

    // Return values of variables from input for use in other classes
    public int getFracNum1()        {return fracNum1;}
    public int getFracDenom1()      {return fracDenom1;}
    public int getFracNum2()        {return fracNum2;}
    public int getFracDenom2()      {return fracDenom2;}    
}  

主要方法文件:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call getFractions method to assign variables from user input
        FractionValues newFracNum1 = new FractionValues();
        newFracNum1.getFracNum1();

        FractionValues newFracDenom1 = new FractionValues();
        newFracDenom1.getFracDenom1();

        FractionValues newFracNum2 = new FractionValues();
        newFracNum2.getFracNum2();

        FractionValues newFracDenom2 = new FractionValues();
        newFracDenom2.getFracDenom2();

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + newFracDenom1.getFracDenom2() + " and " +
                                     newFracNum2.getFracNum2() + "/" + newFracDenom2.getFracDenom2() + " as your fractions.");
    }
}

至少经过一番努力,这两个文件现在都可以编译了。但是,该应用程序不起作用。这是我得到的输出:

您输入了 0/0 和 0/0 作为分数。

一旦这部分起作用,我将添加一个 if 语句,提示用户做出响应,是他们希望继续他们的选择,还是返回到输入提示。



根据下面的宝贵反馈和作业的限制,我得到了以下内容:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    Scanner inInt = new Scanner(System.in);

    // Obtain four integers from user input
    public int getFracNum1()
    {
        System.out.println("Enter an integer for the first numerator:  ");
        return fracNum1 = inInt.nextInt();
    }

    public int getFracDenom1()      
    {
        System.out.println("Enter an integer for the first denominator:  ");
        return fracDenom1   = inInt.nextInt();
    }

    public int getFracNum2()
    {
        System.out.println("Enter an integer for the second numerator:  ");
        return fracNum2     = inInt.nextInt();
    }

    public int getFracDenom2()
    {
        System.out.println("Enter an integer for the second denominator:  ");
        return fracDenom2   = inInt.nextInt();
    }
}

及主要应用方法:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call FractionValues methods to assign variables from user input
        FractionValues newFracNum1 = new FractionValues(); 
        FractionValues newFracDenom1 = new FractionValues(); 
        FractionValues newFracNum2 = new FractionValues(); 
        FractionValues newFracDenom2 = new FractionValues(); 

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + 
                newFracDenom1.getFracDenom2() + " and " + newFracNum2.getFracNum2() +
                "/" + newFracDenom2.getFracDenom2() + " as your fractions."); 
    }
}

两个文件都正确编译,我得到以下预期输出:


为第一个分子输入一个整数:
2个 为第二个分母输入一个整数:
5个 为第二个分子输入一个整数:
6个 为第二个分母输入一个整数:
3个 您输入了 2/5 和 6/3 作为分数。


非常感谢您在方法和构造函数方面的帮助,以及对命名约定的建设性意见。您的评论引导我的地方很可能使我从考试不及格变成了高分!几个星期以来,我一直在为这个概念苦苦挣扎,即使是在一位非常有耐心的 friend 的帮助下也是如此。

最佳答案

代码有一些问题。首先,您看到的输出是在 Object 类(包括 GetFractions 在内的所有类)中找到的 toString() 默认实现的产物> 最终得出)。覆盖此方法以返回实例的字符串表示形式:

@Override
public String toString() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1 + "...");
}

或者不是将实例传递给 System.out.println(),而是传递成员访问方法调用的结果(此类方法称为 getter):

public double getSomeValue() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1.getSomeValue() + "...");
}

请注意,double 和其他原始类型将自动转换为字符串。

其次,您的静态 GetFractions() 方法修改了无效的参数(没有人会看到更改,因为它们是按值传递的)。该方法应该修改现有实例的同名实例变量,然后它不应该是静态的,或者它应该是一个工厂方法,根据用户提供的数据创建新实例,在这种情况下,它会将值传递给构造函数或者它应该是一个构造函数本身。无论哪种方式,您都不想修改方法的参数。以下是三种解决方案的概要:

从输入流中读取数据的非静态方法:

public void fromStream(InputStream inStream) {
  // Read data from inStream into instance variables fracNum1, fracDenom1,...
}

静态工厂方法:

public static GetFractions fromStream(InputStream inStream) {
  int fracNum1,... ;
  // Read data from inStream into local variables fracNume1, ...
  return new GetFractions(fracNum1, ...);
}

构造函数:

public GetFractions(InputStream inStream) {
  // Read data from inStream to initialize instance variables fracNum1, fracDenom1,...
}

另请注意,将 InputStream 传递给所有这些方法比硬编码 System.in 提供更大的灵 active 。

第三,您应该重新考虑您的命名约定。调用与类相同的静态方法虽然可能,但通常是一种不好的做法。此外,建议使用名词表达式调用类和对象,使用动词表达式调用方法。这有助于设计您的类并使代码更具可读性。 GetFractions 更适合作为方法的名称而不是类的名称。 Fractions 会产生更好的类名。

关于java - 从另一个方法传递变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281599/

相关文章:

java - 只允许我的应用程序访问网页

java - 是否有理由为字符串的长度创建变量而不是使用 length() Java

python - functool.partialmethod 和 functool.partial 的用法?

java - 如何随机调用方法(Java JDK11)?

Java不能在没有泛型的情况下在列表中添加对象

java - Android中如何通过多个参数查询DownloadManager

javascript输出变量的名称,而不是值

java - Java 中的静态变量

python - 传递给 Python 中所有实例方法的预处理参数

java - 从命令行构建 IntelliJ Artifact