我希望能够在一个实例方法中从scanner类中获取输入,然后将其传递给我将显示它的另一个实例方法。
这是我的问题的一个例子
import java.io.*;
import java.util.*;
class TestScanner
{
public static void main (String args[])
{
TestScanner disInput = new TestScanner();
TestScanner gInput = new TestScanner();
gInput.grabInput();
disInput.displayInput();
}
void displayInput()
{
System.out.println("Scanner Input here: ");
System.out.println("What is my age: ");
// How do I get age here
System.out.println("What is 2 +2: ");
// How do I get math here
}
void grabInput()
{
int age, math;
Scanner stdin = new Scanner(System.in);
System.out.println("What is my age: ");
age = stdin.nextInt();
System.out.println("What is 2 +2: ");
math = stdin.nextInt();
}
}
答案 0 :(得分:0)
BAD 和避免学习解决方案:将age
和math
个本地变量移动到班级中的static
字段。
该课程将如下所示:
public class TestScanner {
static int age;
static int math;
//rest of your class...
//in method grabInput
static void grabInput() {
//comment the variables
//int age, math;
}
}
由于static
字段的使用,上述代码将有效。首先要了解what static
means和be careful when using it。
您应该问自己以下问题:
TestScanner
的字段吗?TestScanner
的新实例,只是为了显示另一个TestScanner
实例的值吗?如果您对这两个问题的回答都是肯定的,那么您可以创建一个接收TestScanner
实例并打印其内容的方法。这就是你的课程的样子:
public class TestScanner {
//Note: they're not static anymore (yay!)
int age;
int math;
public static void main (String args[]) {
TestScanner disInput = new TestScanner();
TestScanner gInput = new TestScanner();
gInput.grabInput();
//note that now we need to pass the instance of TestScanner
//in order to print its contents
disInput.displayInput(gInput);
}
//method for display purposes
void displayInput(TestScanner testScanner) {
System.out.println("Scanner Input here: ");
System.out.println("What is my age: ");
System.out.println(testScanner.age);
System.out.println("What is 2 +2: ");
System.out.println(testScanner.math);
}
void grabInput() {
Scanner stdin = new Scanner(System.in);
System.out.println("What is my age: ");
this.age = stdin.nextInt();
System.out.println("What is 2 +2: ");
this.math = stdin.nextInt();
}
}
现在问问自己:我需要这一切吗?这是一个很好的设计吗?我可以轻松地执行更改,还是需要花费更多时间和精力,例如,添加新变量,填充并显示它?
此处的主要问题称为cohesion。这就是一个类中的功能程度。如您所见,TestScanner
本身有很多责任:
age
和math
更好的方法是将这些功能分为两类:
Person
(或其他名称)将存储来自用户输入的数据。根据{{1}}和age
字段的名称,我认为该类的正确名称可以是math
。该课程负责存储数据并为不同用途提供数据,例如存储用户输入,然后将其用于显示目的。Person
课程,您将在其中测试TestScanner
的使用情况,以便从用户输入中读取数据并向用户显示数据。设计将如下所示:
Scanner
注意:问题中提供的链接不用于装饰目的。
答案 1 :(得分:0)
您只需要一台扫描仪即可获得输入,完成后需要关闭扫描仪:
int grabInput(String question)
{
// Display a question to user
System.out.println(question);
// Read a response from user
Scanner stdin = new Scanner(System.in);
int input = stdin.nextInt();
stdin.close();
// Return the response
return input;
}
根本不需要任何扫描仪来显示输出:
int displayOutput(String message, int response)
{
System.out.println(message);
System.out.println(response);
}
以下是您对这些更改的主要看法:
public static void main (String args[])
{
String ageQuestion = "What is my age?";
int ageAnswer = grabInput(ageQuestion);
String mathQuestion = "What is 2 + 2?";
int mathAnswer = grabInput(mathQuestion);
displayOutput(ageQuestion, ageAnswer);
displayOutput(mathQuestion, mathAnswer);
}
诀窍是将响应返回给main,因为你需要在另一个函数中访问它们,并将Scanner逻辑埋在一个函数中,这样你就不用担心它了。
答案 2 :(得分:-1)
您可以在TestScanner类中创建一个静态变量,并且您的类的每个实例都可以访问该变量。请注意,变量对于每个类的实例都具有相同的值。
import java.io.*;
import java.util.*;
class TestScanner
{
public static Integer age;
public static Integer math;
public static void main (String args[])
{
TestScanner disInput = new TestScanner();
TestScanner gInput = new TestScanner();
gInput.grabInput();
disInput.displayInput();
}
void displayInput()
{
System.out.println("Scanner Input here: ");
System.out.println("What is my age: ");
// How do I get age here
System.out.pritln(age);
System.out.println("What is 2 +2: ");
// How do I get math here
System.out.pritln(math);
}
void grabInput()
{
Scanner stdin = new Scanner(System.in);
System.out.println("What is my age: ");
age = stdin.nextInt();
System.out.println("What is 2 +2: ");
math = stdin.nextInt();
}
}
您可以查看java here中的静态变量。