簡體   English   中英

有什么辦法可以在不同的類中使用 Scanner 對象嗎?

[英]Is there any way I can use a Scanner object in a different class?

所以我有一個簡單的 Scanner 對象:

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實例聲明為publicstatic 因此,您可以使用類引用來訪問它。

其他類中的代碼。

String intpu = ClassName.scan.next();

ClassName是定義它的類的名稱。

可能還有其他方法可以實現這一點:

  1. 將其傳遞給您要使用它的其他類的方法。

  2. 如果將Scanner實例定義為類的成員,則創建類的實例並使用 getter 方法訪問它。

  3. 您可以在其他類中創建Scanner的新實例。

解決這個問題的常見設計模式是依賴注入。 依賴注入的一種形式稱為構造函數注入。 為此,創建一個接受類所依賴的對象的構造函數。 然后當你實例化那個類時,你傳入你希望它操作的對象(在你的例子中是你的掃描儀)。

例子

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                

    }                                  
}                                      

您可以在調用中將 Scanner 對象的引用傳遞給該方法。 method(Scanner sc)

您可以嘗試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
}

使用繼承,子類可以繼承超類中的掃描儀對象。 我希望這有效。如果出現問題,請告訴我。

也可以在沒有繼承的情況下完成(不擴展):

  • 只需在相關的子類方法中創建超類的對象,如下所示:

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

我解決這個問題的方法是在我調用的需要使用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);
    }
}

調用類.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);
    }

}

這不是最漂亮的東西,但它確實有效。

這是我的操作方法:

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

如果您不想使用靜態導入,請更改import static mypackage.MyScanner.*; 在 MyScanner.java 中import mypackage.MyScanner; . 通過這樣做,您不能再直接調用您的掃描器方法,您需要指定包含這些方法的類。 例如: MyScanner.scanInt()MyScanner.scan()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM