我已经解决了这个问题好几个小时了,我已经取得了很大进展(非常感谢搜索这个网站并应用类似问题中的提示)但我现在似乎陷入了僵局。请看看我做了什么,并指出我出错的地方并提供伪造的代码来纠正,或者指出一个资源可以帮助我填补我理解的空白。我真的觉得好像我只是错过了一个小细节,这个细节会让我对这个话题有意义。
该应用程序的目的是根据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作为分数。
非常感谢您对方法和构造函数的帮助,以及对命名约定的建设性意见。你的评论带给我的地方很可能会让我从考试失败中解脱出来!即使在一位非常耐心的朋友的帮助下,我也一直在为这个概念苦苦挣扎数周。
答案 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代码。