2013-01-12 30 views
2

我正在學習java編程。
當我通過類的實例去了,我看到了下面的代碼在java中創建變量或調用方法

Scanner input = new Scanner (System.in) 

據我所知,它聲明瞭一個掃描儀變量輸入,但我不知道爲什麼我要聲明這樣的變量,但不是由類調用方法使用此功能掃描儀直接?

回答

2

爲什麼我應該聲明這樣的變量,而不是通過直接調用類Scanner中的方法來使用此函數?

只有一個static方法可能會像你所建議的那樣調用。大多數Scanner方法值得一提,不是static

4

您應該聲明Scanner作爲變量,因爲Scanner類不是靜態的。

讓我們打破分配:

  1. 首先,你必須Scanner input。這表示名稱爲input的變量將被分配爲Scanner
  2. 然後,您有new Scanner,它告訴Java您正在創建Scanner類型的新Object以存儲在字段input中。
  3. 然後,您正在調用掃描器類的構造函數。更具體地說,您使用以下值調用它:System.in

這是第三步,這裏至關重要。由於您是新手,如果您不瞭解static修飾符,我會在嘗試處理此操作之前先查看一下。

您的新掃描儀在其構造函數中有一個參數:InputStream。一個InputStream是一個例如鍵盤的接口。以下是不能撥打Scanner.next()的原因:如果您想要有兩個不同的輸入流,該怎麼辦?

通過創建一個變量input,您將存儲在該變量中特定於System.in的Scanner。如果你有一個文件,你可能需要另一個Scanner來處理它的InputStream(雖然文件不是這樣讀取的,你明白了)

如果掃描儀的功能是靜態的,你只能有一個掃描儀。這意味着只能通過掃描儀將用戶限制爲一個輸入流。

+0

我對第一步的措辭感到不舒服,因爲它沒有創建掃描儀。 –

+0

啊,哎呀。我的錯誤,修正了這一點。 – Zyerah

0

您需要詳細瞭解OOP。但基本上你在問什麼能夠直接調用類的方法,被稱爲類的靜態方法。他們不受任何特定情況的約束。靜態方法不知道任何實例特定的數據。在這種情況下,InputStream傳遞給構造函數。

因爲我不知道你指的是什麼Scanner類,所以我認爲寫這個類的人認爲訪問InputStream作爲一個數據成員來執行這些功能是很有用的。因此它是這樣設計的。

一般來說,在OOP中這是事情的設計。對象通過數據實例化,並在對象上調用函數。使用靜態方法可以說在某種程度上破壞了OOP體系結構。

我希望澄清一些事情。

1

看看聲明 - Scanner input = new Scanner(System.in);

我們可把它分成兩個部分 -
(1)名爲input創建引用,在轉讓左側以保持Scanner類型的任何變量。
(2)類型Scanner的對象被實例化爲作業的右側。最後,Scanner類型的實例/對象被賦予新創建的變量。

現在來看看你的問題 -

爲什麼我要聲明這樣的變量而不是由 使用此函數調用類掃描儀直接的方法?

因爲在Scanner類有,它返回一個掃描器類型變量爲與新創建的變量分配input沒有這樣的方法。更重要的是在不創建類的對象的情況下調用類中的函數,該方法應該是靜態的。