从另一个方法传递变量值

时间:2011-11-26 21:03:23

标签: java variables methods parameter-passing

我已经解决了这个问题好几个小时了,我已经取得了很大进展(非常感谢搜索这个网站并应用类似问题中的提示)但我现在似乎陷入了僵局。请看看我做了什么,并指出我出错的地方并提供伪造的代码来纠正,或者指出一个资源可以帮助我填补我理解的空白。我真的觉得好像我只是错过了一个小细节,这个细节会让我对这个话题有意义。

该应用程序的目的是根据2个分子和2个分母的用户输入来加,减,乘和除分数(是的,这是一个课程分配所以请不要给出源代码,而是指示在概念上我出错的地方)。我已将其分解为步骤,第一步是获取用户的输入并将其输出以进行确认。

方法文件:

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 输入第二个分母的整数:
五 输入第二个分子的整数:
6 输入第二个分母的整数:
3 您输入了2/5和6/3作为分数。


非常感谢您对方法和构造函数的帮助,以及对命名约定的建设性意见。你的评论带给我的地方很可能会让我从考试失败中解脱出来!即使在一位非常耐心的朋友的帮助下,我也一直在为这个概念苦苦挣扎数周。

3 个答案:

答案 0 :(得分:3)

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

@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更大的灵活性。

第三,您应该重新考虑您的命名惯例。尽可能调用与类相同的静态方法通常是一种不好的做法。此外,建议使用带有动词表达式的名词表达式和方法来调用类和对象。这有助于设计类并使代码更具可读性。 GetFractions更适合作为方法的名称而不是类。 Fractions可以提供更好的班级名称。

答案 1 :(得分:1)

在更正代码后打印0-s的原因是你实际上从不调用GetFractions静态方法,这不是构造函数。
永远不要像构造函数那样命名方法,只有当它是静态工厂方法时才

同样使用原始代码,您打印了导致GetFractions调用的toString个对象,但未覆盖。
另请注意,get ...的调用没有任何影响,因为返回的值不存储在任何地方。

答案 2 :(得分:1)

您的代码隐式调用您的类GetFractions的toString()方法。因为你还没有覆盖它,所以它来自object(超类)的toString()方法。来自对象的toString()方法返回类似于类名加上哈希码的东西(参见http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#toString%28%29)。这就是你在输出中看到的内容。

您有两种可能:覆盖toString或更改您提到的Eng.Fouad代码。