これはばかげているかもしれませんが、バックグラウンド操作の違いを知りたいです。
InputStream is = new FileInputStream(filepath);
FileInputStream is = new FileInputStream(filepath);
上記の2行のコードの違いとそれらが使用されるシナリオ.
FileInputStream
extends InputStream
:これは、ファイルを読み取るために設計されたInputStreamの特殊なバージョンです。
用途に応じて、InputStreamの実装がいくつかあります。
通常、コードで必要な最も高い型を使用することをお勧めします。したがって、コードがInputStream
からデータを読み取る必要があるが、特にFileInputStream
からデータを読み取る必要がない場合は、InputStream
を使用する必要があります。ただし、オブジェクトの情報をFileInputStream
だけでなくInputStream
のままにする必要がある場合は、FileInputStream
型を保持する必要があります。
本当の違いはありません。 FileInputStream
はInputStream
を拡張するため、InputStream
オブジェクトをFileInputStream
オブジェクトとして割り当てることができます。結局、同じオブジェクトなので、同じ操作が行われます。
この動作は Polymorphism と呼ばれ、オブジェクト指向プログラミングでは非常に重要です。
コードの最初の行は、FileInputStream
にロックされないため、おそらく2行目よりも望ましいでしょう。
これは、オブジェクト指向プログラミングの長所の1つです。タイプを指定しないと、後で使用するストリームのタイプを変更できます。ここでFileInputStream
だけが必要だと確信している場合は、コードの2行目を使用してください。
他の答えはそれをかなり釘付けにしましたが、私は次のビットを追加したいと思います。
参照変数is
のタイプが厳密にクラスの内部実装の詳細である場合、つまり、他のクラスが直接または間接的にそれを検出することはないため、実際にはありません。より基本的なタイプ(InputStream)に対してプログラムを作成したとしても、2つのステートメントの違いは理由があります。
ただし、クラスのインターフェイスを介してFileInputStream固有の動作をリークするわずかなヒントさえある場合は、これが解決しようとしている問題に不可欠ではなく、常により基本的な型に対してプログラミングする必要があります。
もちろん、これは一般的な良い習慣であり、InputStreamsなど以外にも当てはまります。
他の回答状態と同様に、動作に違いはありません。それでも同じオブジェクトであり、同じメソッドが実行されます。 InputStream
を継承する任意のタイプのオブジェクトをその変数に割り当てることができます。
ただし、これまで誰も言及していなかったことは、その変数のInputStream
で宣言されている操作のみを呼び出すことができるということです。 FileInputStream
がいくつかの追加操作を提供する場合、それを呼び出そうとするとコンパイラーはエラーをスローします。この場合、変数の型としてFileInputStream
を使用する必要があります。
違いはありません。どちらの場合も、FileInputStream
を作成します。 1つ目は、おそらく、柔軟性を可能にするために具象クラスではなくクラスinterface
を使用する必要があるという点で、おそらくより優れたプログラミングスタイルです(つまり、BufferedInputStream
を使用することを決定します)。