Javaプログラミングを学んでいます。
クラスの例を調べたところ、以下のコードが表示されました
Scanner input = new Scanner (System.in)
Scanner 変数入力を宣言することは理解していますが、なぜそのような変数を宣言する必要があるのに、クラス Scanner のメソッドを直接呼び出してこの関数を使用しないのだろうか?
クラスは静的ではないScanner
ため、a を変数として宣言する必要があります。Scanner
割り当てを分解しましょう。
Scanner input
ます。これは、 name の変数がinput
として割り当てられることを示しますScanner
。new Scanner
の新しいを作成していることを Java に伝えます。Object
Scanner
input
System.in
。ここで重要なのは 3 番目のステップです。あなたは新しいので、修飾子を理解していない場合は、static
これを処理する前に調べます.
新しい Scanner のコンストラクタには 1 つの引数があります: InputStream
. AnInputStream
は、たとえばキーボードへのインターフェイスです。を呼び出せない理由は次のScanner.next()
とおりです。2 つの異なる入力ストリームが必要な場合はどうすればよいでしょうか。
variable を作成することにより、System.in に固有input
のものをその変数内に格納します。ファイルがある場合は、その InputStream 用に別の Scanner が必要になる場合があります (ファイルは実際にはそのように読み取られるわけではありませんが、要点はわかります)。Scanner
スキャナーの機能が静的である場合、スキャナーは 1 つしか持てません。これは、ユーザーを Scanner 経由で 1 つの入力ストリームのみに制限することを意味します。
このような変数を宣言する必要があるのに、クラス Scanner のメソッドを直接呼び出してこの関数を使用しないのはなぜですか?
あなたが提案するようにメソッドだけstatic
が呼び出される可能性があります。Scanner
言及する価値のあるほとんどのメソッドは、 static
.
ステートメントを見てください - Scanner input = new Scanner (System.in);
これを 2 つの部分に分けることができます -
(1)という名前の参照が作成され、代入の左側にinput
任意の型の変数が保持されます。(2)型のオブジェクトは、代入の右側でインスタンス化されます。最後に、タイプのインスタンス/オブジェクトに、新しく作成された変数が割り当てられます。 Scanner
Scanner
Scanner
さあ、あなたの質問に来てください -
このような変数を宣言する必要があるのに、クラス Scanner のメソッドを直接呼び出してこの関数を使用しないのはなぜですか?
Scanner
クラスには、新しく作成された変数が割り当てられたスキャナー型変数を返すようなメソッドがないためですinput
。さらに、クラスのオブジェクトを作成せずにクラス内で関数を呼び出すには、メソッドを「静的」にする必要があります。
OOP についてもう少し読む必要があります。しかし、基本的に、クラスのメソッドを直接呼び出すことができるかどうかについて質問しているのは、クラスの静的メソッドと呼ばれます。それらは特定のインスタンスにバインドされていません。静的メソッドには、インスタンス固有のデータに関する知識はありません。この場合、InputStream がコンストラクターに渡されます。
あなたが参照している特定の Scanner クラスがわからないので、クラスを書いた人々は、関数が作用するためのデータメンバーとして InputStream にアクセスできると便利だと感じたと思います。したがって、そのように設計されました。
一般的に OOP で言えば、これが物事の設計方法です。オブジェクトはデータでインスタンス化され、関数はオブジェクトで呼び出されます。静的メソッドの使用は、間違いなく OOP アーキテクチャをある程度壊します。
物事が多少明確になることを願っています。