2015-10-26 60 views
0

我希望能够从一个实例方法内的scanner类获取输入,并将其传递给另一个实例方法,我将在其中显示它。如何将输入从一个实例方法中的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(); 

     } 
    } 
+1

检查[将信息传递给方法或构造函数](https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html)。另外,检查[为什么静态变量被认为是邪恶的?](http://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil)如果有人发布一个答案,使用静态 – sam

+0

@sam有人回答使用'static'为*解决方案* –

+0

@LuiggiMendoza好了,我的努力张贴链接已见成效:)使用'static'领域的解决方案 – sam

回答

-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中的静态变量是什么。

+0

避免。 –

+0

这个工程谢谢:) – Jets

+0

如果你不想使用静态字段,你可以查看[Singleton design pattern](http://www.tutorialspoint.com/design_pattern/singleton_pattern.htm) – Theo

0

BAD避免同时LEARNING解决方案:移动agemath局部变量在类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 meansbe 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本身有许多责任:

  • 商店agemath
  • 从用户输入读吧
  • 显示的数据传送给用户

更好的方法将是在两类分离这些功能:

  1. Person(或其他名称)将存储来自用户输入的数据。基于agemath字段的名称,我想这个类的一个适当的名称可能是Person。这门课将负责存储数据并提供不同的用途,例如存储用户输入,然后将其用于显示目的。
  2. TestScanner类,其中将测试的Scanner使用以从用户输入和显示数据中的数据读出到用户。

的设计看起来就像这样:

class Person { 
    private int age; 
    private int math; 
    public Person(int age, int math) { 
     this.age = age; 
     this.math = math; 
    } 
    public int getAge() { 
     return this.age; 
    } 
    public int getMath() { 
     return this.math; 
    } 
    //setters avoided for this case 
} 

class TestScanner { 
    Scanner scanner; 
    public TestScanner(Scanner scanner) { 
     this.scanner = scanner; 
    } 
    public Person grabInput() { 
     System.out.println("What is my age: "); 
     int age = stdin.nextInt(); 
     System.out.println("What is 2 +2: "); 
     int math = stdin.nextInt(); 
     return new Person(age, math); 
    } 
    public void displayInput(Person person) { 
     System.out.print("My age: "); 
     System.out.println(person.getAge()); 
     System.out.print("My value of 2 +2: "); 
     System.out.println(person.getMath()); 
    } 
    public static void main(String[] args) { 
     TestScanner testScanner = new TestScanner(new Scanner(System.in)); 
     Person person = testScanner.grabInput(); 
     testScanner.displayInput(person); 
    } 
} 

注意:问题而提供的链接是不是用来装饰的目的。

+0

如果使变量静态的,那么'grabInput()'也需要是静态的。 – Rainbolt

+0

@Rainbolt没有必要。您可以访问来自非静态方法的'static'字段。这是一个糟糕的做法,但它的工作原理。我正在编辑。 –

+0

对不起,我自己填补了空白('//你的班级其他......'),并认定它不起作用,但仅仅是因为我实施了错误。我明白现在它是如何工作的。我反对建议创建一个Person类,因为OP似乎还不知道类和实例。我假设他仍然在学习方法和输入/输出,并试图避免创建任何事物(除扫描器外),我写了答案。 – Rainbolt

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); 
} 

关键是要返回主响应因为你需要访问他们在其他功能,并埋葬扫描逻辑功能于一体,使您不必担心其他地方。

相关问题