System.in は静的な InputStream インスタンスであるため、Java API ドキュメントで確認できます
まず、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 は抽象クラス (インターフェイス) であると述べましたが、実際には、すべてのインターフェイス クラスと抽象クラスはパラメーターとして使用できますが、それらによって実装されることは間違いなくありませんが、実装することはできます。結局のところ、親クラスが出現する場所は、サブクラスを置き換えることができるので、ここでは問題ありません
System.in は静的な InputStream インスタンスであるため、Java API ドキュメントで確認できます
まず、System.in は、InputStream 型のオブジェクトであり、ソース コードでは次のようになります。
リーリーSystem.in は標準入力に属しており、キーボードまたはその他の方法でデータを入力できることがわかります。
コメントを読むと、このメソッドが setIn0(in) の設定に使用されていることがわかります。しかし、ソース コードでは、このオブジェクトには (明示的な) 初期化メソッドがありません。ソース コードを読むと、次のメソッドが見つかります。 リーリー
setIn0(in) を調べると、このメソッドは基になるインターフェイスを呼び出すことで in の設定を実現していることがわかります。では、ソフトウェアの実行中にどのように初期化されるのでしょうか。
ネイティブとしてマークされたメソッドは、他のコードを呼び出す JVM によって実装される関数です。これは、ブートストラップ クラスローダーが実際には C で実装されているように感じられると思いますが、ロードするために JVM によって呼び出されます。それぞれの基本的な JAR クラス。System クラスには次のコードがあります:
リーリー このコードから、ソフトウェアの実行時に、最初に静的コード ブロックが実行され、基礎となるメソッド registerNatives() が呼び出されて System クラスが初期化されることがわかります。このメソッドは、initializeSystemClass() メソッドを呼び出して System クラスを初期化します。これらの 2 つのステップは VM によって実装され、initializeSystemClass() メソッドを読み取ると、3 つのコードが setIn0、setOut0、および steErr0 と呼ばれ、標準入力、標準出力、および標準エラーの 3 つの出力ストリームを初期化することがわかります。 . この時点で、System.in、out、および err の初期化プロセスはすべてクリアです。
さらに、InputStream は抽象クラス (インターフェイス) であると述べましたが、実際には、すべてのインターフェイス クラスと抽象クラスはパラメーターとして使用できますが、それらによって実装されることは間違いなくありませんが、実装することはできます。結局のところ、親クラスが出現する場所は、サブクラスを置き換えることができるので、ここでは問題ありません