天蓬老师2017-04-18 10:56:47
まず、System.in は、InputStream 型のオブジェクトであり、ソース コードでは次のようになります。
リーリーSystem.in は標準入力に属しており、キーボードまたはその他の方法でデータを入力できることがわかります。
しかし、ソース コードでは、このオブジェクトには (明示的な) 初期化メソッドがありません。ソース コードを読むと、次のメソッドが見つかります。
リーリー
setIn0(in) を調べると、このメソッドは基になるインターフェイスを呼び出すことで in の設定を実現していることがわかります。では、ソフトウェアの実行中にどのように初期化されるのでしょうか。
System クラスには次のコードがあります:
リーリー
このコードから、ソフトウェアの実行時に、最初に静的コード ブロックが実行され、基礎となるメソッド registerNatives() が呼び出されて System クラスが初期化されることがわかります。このメソッドは、initializeSystemClass() メソッドを呼び出して System クラスを初期化します。これらの 2 つのステップは VM によって実装され、initializeSystemClass() メソッドを読み取ると、3 つのコードが setIn0、setOut0、および steErr0 と呼ばれ、標準入力、標準出力、および標準エラーの 3 つの出力ストリームを初期化することがわかります。 . この時点で、System.in、out、および err の初期化プロセスはすべてクリアです。
さらに、InputStream は抽象クラス (インターフェイス) であると述べましたが、実際には、すべてのインターフェイス クラスと抽象クラスはパラメーターとして使用できますが、それらによって実装されることは間違いなくありませんが、実装することはできます。結局のところ、親クラスが出現する場所は、サブクラスを置き換えることができるので、ここでは問題ありません