1

抽象クラスは、サブクラスがそれを読み取ってから に変換InputStreamするメソッドを実装する必要があることを示しています。read()one byteunsigned int

System.inでありInputStream、私ができること:

 int i = System.in.read();

私の質問は..このメソッドはどこに実装されていますか? なぜそれが機能するのですか?奇妙な質問かもしれませんが、内部で何が起こっているのかを調べようとしています.InputStreamクラスのオブジェクトを使用していて、そのサブクラスのオブジェクトを使用していないため、実際のメソッドがどこに実装されているのか、なぜそれが機能するのか疑問に思っています. ..

4

4 に答える 4

2

System.in は read メソッドが実装された InputStream の実装です。

のソースをSystem見ると、実際にFileInputStreamはファイル ハンドル 0 (標準入力ストリーム) を開いていることがわかります。しかし、これは実際には関係ありません。あなたが知る必要がある唯一のことは、あなたがそれから読むことができるということです. FileInputStreama 、 aStringInputStreamまたはその他のネイティブの場合は関係ありませんInputStream。それがインターフェースの要点です。特定の実装について心配することなく、ほとんどの場合、インターフェースに対してプログラミングすることができます。

于 2012-12-03T09:37:46.393 に答える
1

InputStreamはのタイプでありSystem.in、クラスではありません(InputStream抽象であるため、直接インスタンス化できないため)。

検討:

Object obj = "123";

変数の型はですobjObject、によって参照されるobjインスタンスはのインスタンスですStringtoString()の実装で呼び出された場合はobj、の実装でStringはなく、が使用されObjectます。

同じことが。にも当てはまりSystem.inます。そこに格納されている実際のインスタンスにはInputStream、のサブクラスがあり、抽象メソッドの独自の実装があります。に格納されているインスタンスのクラスを知りたい場合は、System.inを呼び出すことができますSystem.in.getClass()

于 2012-12-03T09:46:24.640 に答える
1

内部で起こっていることは次のとおりです。クラスのin属性は、System実行時に、あるクラスのオブジェクトへの参照に割り当てられますX。そのクラスXは extendsInputStreamであるため、readメソッドを実装します。

クラスが何であるかを確実に伝えることはできません (つまり、どこにも指定されていません) X。あなたが知っているのは、それが拡張するということだけですInputStream。異なる JDK は異なるクラスを使用する場合があります。

于 2012-12-03T09:42:45.640 に答える