- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经解决这个问题几个小时了,并且取得了重大进展(这在很大程度上要归功于搜索该站点并应用在类似问题中找到的提示),但我现在似乎陷入了僵局。请看一下我所做的,要么指出我哪里出错并提供伪代码来更正,要么为我指出可以帮助我填补理解空白的资源。我真的觉得好像我只是遗漏了一个微小的细节,这些细节将使这个主题对我来说有意义。
该应用程序的目的是根据用户输入的 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/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!