我正在學習java編程。
當我通過類的實例去了,我看到了下面的代碼在java中創建變量或調用方法
Scanner input = new Scanner (System.in)
據我所知,它聲明瞭一個掃描儀變量輸入,但我不知道爲什麼我要聲明這樣的變量,但不是由類調用方法使用此功能掃描儀直接?
我正在學習java編程。
當我通過類的實例去了,我看到了下面的代碼在java中創建變量或調用方法
Scanner input = new Scanner (System.in)
據我所知,它聲明瞭一個掃描儀變量輸入,但我不知道爲什麼我要聲明這樣的變量,但不是由類調用方法使用此功能掃描儀直接?
爲什麼我應該聲明這樣的變量,而不是通過直接調用類Scanner中的方法來使用此函數?
只有一個static
方法可能會像你所建議的那樣調用。大多數Scanner
方法值得一提,不是static
。
您應該聲明Scanner
作爲變量,因爲Scanner
類不是靜態的。
讓我們打破分配:
Scanner input
。這表示名稱爲input
的變量將被分配爲Scanner
。new Scanner
,它告訴Java您正在創建Scanner
類型的新Object
以存儲在字段input
中。System.in
。這是第三步,這裏至關重要。由於您是新手,如果您不瞭解static
修飾符,我會在嘗試處理此操作之前先查看一下。
您的新掃描儀在其構造函數中有一個參數:InputStream
。一個InputStream
是一個例如鍵盤的接口。以下是不能撥打Scanner.next()
的原因:如果您想要有兩個不同的輸入流,該怎麼辦?
通過創建一個變量input
,您將存儲在該變量中特定於System.in的Scanner
。如果你有一個文件,你可能需要另一個Scanner來處理它的InputStream(雖然文件不是這樣讀取的,你明白了)
如果掃描儀的功能是靜態的,你只能有一個掃描儀。這意味着只能通過掃描儀將用戶限制爲一個輸入流。
您需要詳細瞭解OOP。但基本上你在問什麼能夠直接調用類的方法,被稱爲類的靜態方法。他們不受任何特定情況的約束。靜態方法不知道任何實例特定的數據。在這種情況下,InputStream傳遞給構造函數。
因爲我不知道你指的是什麼Scanner類,所以我認爲寫這個類的人認爲訪問InputStream作爲一個數據成員來執行這些功能是很有用的。因此它是這樣設計的。
一般來說,在OOP中這是事情的設計。對象通過數據實例化,並在對象上調用函數。使用靜態方法可以說在某種程度上破壞了OOP體系結構。
我希望澄清一些事情。
看看聲明 - Scanner input = new Scanner(System.in);
我們可把它分成兩個部分 -
(1)名爲input
創建引用,在轉讓左側以保持Scanner
類型的任何變量。
(2)類型Scanner
的對象被實例化爲作業的右側。最後,Scanner
類型的實例/對象被賦予新創建的變量。
現在來看看你的問題 -
爲什麼我要聲明這樣的變量而不是由 使用此函數調用類掃描儀直接的方法?
因爲在Scanner
類有,它返回一個掃描器類型變量爲與新創建的變量分配input
沒有這樣的方法。更重要的是在不創建類的對象的情況下調用類中的函數,該方法應該是靜態的。
我對第一步的措辭感到不舒服,因爲它沒有創建掃描儀。 –
啊,哎呀。我的錯誤,修正了這一點。 – Zyerah