0

これはひどくばかげた質問だと思いますが、API (Java Sound API など) やパッケージ (Sound の javax.sound.sampled など) がAPI) にはインターフェイスが含まれており、これらのインターフェイスのメソッドは簡単に呼び出すことができます。

インターフェイスにメソッド定義がない場合、何が呼び出されていますか?

4

3 に答える 3

0

Java Sound API とその Service Provider Interface に関するドキュメントを読む必要があります。Java Sound API Guide の第 1 章では、API の設計、実装、および Service Provider Interface を実装するさまざまなプロバイダーによって実装を拡張する方法について説明しています。

簡単に言うと、インターフェースの実装は存在しますが、アプリケーション開発者はこれらのクラスに直接アクセスできません。

Java 6 (Windows) では、デフォルトの Java Sound 実装は、rt.jar に含まれる com.sun.media.sound パッケージと jsound*.dll という名前の DLL によって実装されます。SPI モデルを使用すると、実装を他のサービス プロバイダーに置き換えたり、拡張したりできます。SPIモデルがJavaでどのように機能するかを説明するこの他のStackOverflowの回答を見つけました

于 2012-04-20T20:04:53.047 に答える
0

インターフェイスをインスタンス化することはできません。インターフェイスを実装するクラスのみをインスタンス化できます。

private Clip m_clip;

これは何もインスタンス化したり呼び出したりしません。Clipインターフェイス(または)を実装するオブジェクトへの参照を格納できる変数を宣言するだけですnull

于 2012-04-20T16:53:52.807 に答える
0

オブジェクトはインターフェイス型で宣言できますが、具象型でのみ初期化できます。そう

private Clip m_clip;

宣言だけなので大丈夫です。を使用する前に、初期化m_clipする必要があります。つまり、有効なオブジェクトを指すようにします。

m_clip = new Clip();

Clipはインターフェイスであるため、インスタンス化できないため、コンパイル エラーが発生します。でも、

class MyClip implements Clip { ... }
...
m_clip = new MyClip();

is OK:インターフェイスを実装MyClipする具象(非抽象) クラスClipであるため、必要なときにいつでもインスタンス化して使用できますClip。このステートメントの後、 の静的型m_clipですClip(これは、コンパイル時にコンパイラーと のクライアントに知られている型ですm_clip) が、その動的または実行時の型MyClipです。これはコンパイラによってトレースされず、クライアントに必ずしも知られているわけでもありません。m_clip. これは、この単純な例に基づいて奇妙に見えるかもしれませんが、実際のオブジェクトがメソッドから返される可能性があることを考慮してください。これは、別のクラスにある可能性があり、あなたが作成したものではないため、そこで何が起こっているのか誰も知りません。使用される具象型は、外部からは見えない場合もあります。

を初期化するm_clipと、そのクライアントはそれを使用できます (たとえば、そのメソッドを呼び出します)。しかし、彼らはその公開インターフェース、つまり で宣言されたメソッドしか見ることができませんClip。これはすべて複雑に聞こえるかもしれませんが、クライアントに影響を与えることなく、実際の (実行時の) 型をm_clipいつでも変更できるという大きな利点があります。たとえば、上の行を次のように変更します。

m_clip = new SomeOtherClip();

実装は変更されますが、クライアントはコードを何も変更せずに引き続き使用できます。

于 2012-04-20T16:54:44.140 に答える