Java 我可以在不同的类中使用Scanner对象吗?

Java 我可以在不同的类中使用Scanner对象吗?,java,java.util.scanner,user-input,Java,Java.util.scanner,User Input,所以我有一个简单的扫描器对象: Scanner scan = new Scanner (System.in); 我试图在一个我在另一个类中声明的方法中使用这个Scanner对象。有没有办法做到这一点?我还尝试使用: public static final Scanner scan = new Scanner(System.in); 但这并没有真正起作用 public static final Scanner scan = new Scanner(System.in); 正如您已将Scann

所以我有一个简单的扫描器对象:

Scanner scan = new Scanner (System.in);
我试图在一个我在另一个类中声明的方法中使用这个Scanner对象。有没有办法做到这一点?我还尝试使用:

public static final Scanner scan = new Scanner(System.in);
但这并没有真正起作用

public static final Scanner scan = new Scanner(System.in);
正如您已将Scanner实例声明为public和static一样。因此,您可以使用类引用访问它

另一个类中的代码

String intpu = ClassName.scan.next();
ClassName是定义它的类的名称

可以通过其他方式实现这一点:

将此传递给要使用它的另一个类的方法

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

您可以在另一个类中创建扫描仪的新实例

String intpu = ClassName.scan.next();

可以在调用中将Scanner对象的引用传递给该方法。 类似methodScanner sc的东西您可以尝试继承: 超级班:

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对象是静态的,您可以像这样简单地使用它:

 Scanner takeIn=superclass.scan.next();

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

范例

主-调用方类:

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        AnotherReader anotherReader = new AnotherReader(scan);
        anotherReader.readSomething();
    }
}
另一个Reader-需要扫描程序依赖项的类:

public class AnotherReader {           

    Scanner scan;                      

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

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

    }                                  
}                                      

我解决这个问题的方法是将Scanner参数添加到我正在调用的需要使用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);
    }

}
这不是最漂亮的东西,但它很管用。

我是这样做的:

在新包中创建MyScanner.java,在本例中为:mypackage

包我的包; 导入java.util.Scanner; 公共类MyScanner { 静态扫描仪扫描=新的ScannerSystem.in; 公共静态字符串扫描 { 返回scan.next; } 公共静态字符串扫描线 { 返回scan.nextLine; } 公共静态整型扫描 { 返回scan.nextInt; } } 通过静态导入mypackage的MyScanner类中的所有方法,可以在任何地方使用它

包装你的包装; 导入静态mypackage.MyScanner.*; 公共班机 { 公共静态无效字符串[]args { System.out.print输入一个整数:; int a=扫描int; System.out.printlint a=+a; } }
如果不想使用静态导入,请更改导入静态mypackage.MyScanner.*;在MyScanner.java中导入mypackage.MyScanner;。这样,您就不能再直接调用scanner方法了,您需要指定包含这些方法的类。例如:MyScanner.scanInt,MyScanner.scan。

当我尝试这样做时,它不会编译,并且表示表达式的开头非法。你认为问题可能是因为我在定义的类和另一个类中使用了这个Scanner对象吗?@Subhan你如何使用它?在定义类时,您可能正在尝试读取输入并初始化类成员。您需要在任何方法中使用此选项。不能在成员声明中调用实例方法。可以调用静态方法。