有什么办法可以在不同的类中使用Scanner对象吗?

时间:2015-12-26 18:30:08

标签: java java.util.scanner user-input

所以我有一个简单的Scanner对象:

Scanner scan = new Scanner (System.in);

我试图在我在另一个类中声明的方法中使用此Scanner对象。无论如何这可以做到吗?我也尝试过使用:

public static final Scanner scan = new Scanner(System.in);

但这并没有真正帮助

6 个答案:

答案 0 :(得分:4)

public static final Scanner scan = new Scanner(System.in);

您已将Scanner个实例声明为publicstatic。所以你使用Class引用访问它。

其他类中的代码。

String intpu = ClassName.scan.next();

ClassName是定义它的类的名称。

可能还有其他方法可以实现这一目标:

  1. 将此传递给您要使用它的其他类的方法。

  2. 如果将Scanner实例定义为类的成员,则创建类的实例并使用getter方法访问它。

  3. 您可以在其他课程中创建Scanner的新实例。

答案 1 :(得分:3)

解决此问题的常见设计模式是依赖注入。一种形式的依赖注入称为构造函数注入。为此,创建一个接受该类所依赖的对象的构造函数。然后,当您实例化该类时,您传入了您希望它操作的对象(在您的情况下是您的扫描仪)。

示例

Main - 来电者课程:

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        AnotherReader anotherReader = new AnotherReader(scan);
        anotherReader.readSomething();
    }
}

AnotherReader - 需要Scanner依赖关系的类:

public class AnotherReader {           

    Scanner scan;                      

    public AnotherReader(Scanner scan) 
        this.scan = scan;              
    }                                  

    public void readSomething(){       
        String line = scan.nextLine(); 
        // Do something                

    }                                  
}                                      

答案 2 :(得分:1)

您可以在通话中传递Scanner对象对该方法的引用。 像method(Scanner sc)

这样的东西

答案 3 :(得分:1)

您可以尝试inheritance: 超级课程:

public class superclass
{
     Scanner scan=new Scanner(System.in); 
     //scanner object declared globally
     //constructor
     //other methods etc.
}

子类:

public class subclass extends superclass
{
//the scanner object can be inherited
}

使用继承,子类可以继承超类中的scanner对象。 我希望这有效。如果出现问题,请告诉我。

也可以在没有继承的情况下完成(不扩展):

  • 只需在相关的子类方法中创建超类的对象:

     superclass ob=new superclass();
     //created superclass object
     String takeIN= ob.scan.next(); 
      /*refers to scanner object in superclass  because scanner object is declared a field(global object) in superclass.*/
    
  • 按照您的示例,如果超类中的扫描仪对象是静态的,您只需使用它:

     Scanner takeIn=superclass.scan.next();
    

答案 4 :(得分:0)

我解决这个问题的方法是在我调用需要使用扫描程序的类的方法中添加一个Scanner参数,然后在调用方法时将scanner变量作为参数传递。

我的主要方法:

import java.util.Scanner;

public class ScannerTest
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        CalledClass cC = new CalledClass();

        cC.testMethod(input);
    }
}

CalledClass.java:

import java.util.Scanner;

public class CalledClass
{
    public void testMethod(Scanner x)
    {
        System.out.println("Enter anything");
        String myString = x.next();
        System.out.println(myString);
    }

}

这不是最漂亮的东西,但它有效。

答案 5 :(得分:0)

这是我的方法:

  1. 在新程序包中创建MyScanner.java(在本例中为mypackage)

    package mypackage;
    
    import java.util.Scanner;
    
    public class MyScanner
    {
        static Scanner scan = new Scanner(System.in);
    
        public static String scan()
        {
            return scan.next();
        }
    
        public static String scanLine()
        {
            return scan.nextLine();
        }
    
        public static int scanInt()
        {
            return scan.nextInt();
        }
    }
    
  2. 通过(静态)从mypackage的MyScanner类导入所有方法来在任何地方使用它。

    package yourpackage;
    
    import static mypackage.MyScanner.*;
    
    public class Main
    {
        public static void main(String[] args)
        {
            System.out.print("put an integer : ");
            int a = scanInt();
            System.out.println("int a = " + a);
        }
    }
    

如果您不想使用静态导入,请将MyScanner.java中的import static mypackage.MyScanner.*;更改为import mypackage.MyScanner;。这样,您不能再直接调用扫描程序方法,需要指定包含这些方法的类。例如:MyScanner.scanInt()MyScanner.scan()