7

誰かがJavaのマーカーインターフェースの契約を説明してもらえますか?

例:Clonableがフィールド/メソッドのないマーカー インターフェイスの場合、どこにclone()定義されていますか?

Clonableを使用するたびになぜ i/fを実装する必要clone()があるのですか?

私の質問は、 ifがクラスclone()のメソッドである場合、なぜi/f を実装して overrideにするのかということでした。java.lang.ObjectClonableclone()

誰かがこの Java の規則について詳しく説明できますか?

前もって感謝します

4

6 に答える 6

8

clone()java.lang.Objectすべてのクラスが拡張するクラスで定義されますが、ですprotected。これは実際には、オブジェクトのフィールドごとのクローンを作成する具体的なメソッドの実装ですが、Cloneableこれが許可されていることを示すためにインターフェイスを実装した場合に限ります。

実際には、多くの人がメソッドをオーバーライドして、clone()メソッドをpublic作成し、クラスの外部からクローンを作成できるようにします。

このパターン全体は非常に珍しく、通常は複製するものではありません。マーカーインターフェイスとメソッドがペアになっているJVMの他の多くの例は考えられません。Java 5以降では、マーカーに注釈を使用することをお勧めします。たとえば、@XmlRootElementタイプをJax-Bシリアル化可能(Java 5以降)としてマークするために使用さSerializableれるのに対し、クラスがバイナリシリアル化可能であることを示すために使用されるインターフェース(Java 5以前)。

于 2012-11-08T08:22:14.147 に答える
1

Clonableclone()で保護されているメソッドが含まれていませんjava.lang.Object

詳細はこちら

Josh Blochの効果的なJavaからの引用:

「クローン可能インターフェースは、オブジェクトがクローンを許可することをアドバタイズするためのミックスインインターフェースとして意図されていました。残念ながら、この目的を果たすことはできません...これは非常に非典型的なインターフェースの使用であり、エミュレートされるものではありません...クラスに何らかの影響を与えるためのインターフェース、そのクラスとそのすべてのスーパークラスは、かなり複雑で、強制力がなく、ほとんど文書化されていないプロトコルに従わなければなりません。」

于 2012-11-08T08:26:39.820 に答える
1

マーカー インターフェイスは、クラスにタグを付けるための一般的な手法です。クラスに動作を追加しません (一般に)。Clonableインターフェースはそのようなタグです: でタグ付けされたすべてのクラスClonableは、それ自体を複製できます (これが規則です)。

と同じですがSerializable、そのマーカー インターフェイスの背後にはさらにいくつかの隠された魔法があります (オブジェクト シリアライザーは、タグ付けされたクラスが実装するかどうかに関係なく、いくつかのメソッドとフィールドを探します) 。

おまけ情報: は忘れてくださいClonable。壊れています。実際にクローンを作成する場合は、コピー コンストラクター パターンを探してください。

于 2012-11-08T08:29:12.863 に答える
1

このjava.lang.objectクラスは、すべての Java クラスのスーパー/親クラスです。Java でオブジェクトを作成する場合は、java.lang.objectクラスを実装する必要があります。コードに Object スーパークラスをインポートしていない場合、コンパイラはそれをコードに暗黙的にインポートします。したがって、 clone( clone() メソッドが子クラスからではなく、スーパークラス (オブジェクトクラス) から呼び出されることを意味するプログラムの) メソッド。

マーカー インターフェイス: その真のマーカー インターフェイスは空のインターフェイスであり、プロパティと動作は含まれません。さて、疑問が提起されるかもしれません。

Q.私たちのプログラムで Predefined Marker インターフェイスを使用する場合、誰が実装しますか?

回答: JVM 内でそのマーカー インターフェイス機能が定義されているため、JVM がその責任を負います。そのため、いくつかの高度な機能を実装してユーザーに追加するのはプログラムです。

そのため、プログラマーは ClonableMarker インターフェイスを実装する必要がなく、JVM がその責任を負います。

于 2015-06-01T09:33:08.933 に答える
-1

マーカー インターフェイス自体には本体がありません。それらは、Java インタープリターに、それらを拡張するクラスのオブジェクトに対して事前定義された特定の方法で動作するように要求するだけです。

于 2012-11-08T08:18:44.407 に答える