なぜJavaは、メソッドが定義されていないインターフェイスを導入するのですか?たとえば、Cloneable
、Serializable
、Type
などです。
2番目のこと:_Class.class
_パッケージには、本体なしでregisterNatives()
と定義され、静的ブロックから呼び出されるメソッドが1つありますが、_Class.class
_は抽象ではなく、final
です。なぜそうなのか?なぜJava静的ブロックから呼び出されるために、本体のないメソッドが必要なのですか?
Javaは、メソッドが定義されていないインターフェイスを導入するのはなぜですか?
これは タグ付きまたはマーカーインターフェイス と呼ばれます。これらは、いかなる使用または操作にも使用されません。これらのメソッドは、クラスにタグを付けたりマークを付けたりするために使用されます。これにより、someclassがそれらのクラスの子であるかどうかを判別できます。
2番目の質問について
よく見ると、宣言が
private static native void registerNatives();
したがって、registerNatives
はネイティブメソッドです。
では、ネイティブメソッドとは何ですか。あなたが見たら これはそう質問です
このメソッドは「ネイティブ」コードで実装されます。つまり、JVMで実行されないコードです。通常、CまたはC++で記述されます。
ネイティブメソッドは通常、他のプログラミング言語で記述されたシステムコールまたはライブラリとのインターフェイスに使用されます。
したがって、これらのメソッドはネイティブコードからロードされます。したがって、メソッドの本体を宣言する必要はありませんが、ネイティブコードから実装されているため、抽象的ではありません。
Marker interfaceは、Javaコンパイラにメッセージを通知するタグとして使用され、特別な動作を追加できるようにします。それを実装するクラス。Javaマーカーインターフェイスにはメンバーがありません。
Marker interfacesの目的は、マーカーインターフェイスを実装している場合にクラスに機能を提供することにより、クラスにある種の機能を強制することです。
最初のものについては、実際にマーカーインターフェイスを求めています。マーカーインターフェイスは、動作に何も追加しないように設計されていますが、オブジェクトの多形変換のみをサポートします。例えばSerializableにより、オブジェクトはJVMの境界を越えてストリーミングできるようになります。マーカーインターフェイスは、「ユニバーサルタイプ置換」の哲学に従います。
2つ目は、実際にJNIを要求しています。 JavaはすべてのコードをJava形式で実装しているわけではありません。つまりJava構文に従うクラスとコードです。または、ネイティブプラットフォームAPIにドリルダウンして、そのAPIの何かを実装する必要があります。たとえば、ソケットとTCP通信。Javaこれにより、実際にはプラットフォームに依存しなくなります。JVMランタイムは、プラットフォームベースのネイティブメソッドとdllまたは.soライブラリを使用してプラットフォームを実装および統合するため、プラットフォームに依存します。プログラマーとして、高レベルをJava = SDKAPI呼び出し。
Javaプログラミング言語の「クリーンな」機能の1つは、インターフェイス(純粋な動作)とクラス(状態と動作)の分離を義務付けることです。インターフェイスはJavaは、派生クラスの動作を指定します。多くの場合、動作のないJavaのインターフェイスに出くわします。つまり、これらは単なる空のインターフェイス定義です。これらは、マーカーインターフェイス。Java APIのマーカーインターフェイスの例は次のとおりです。
マーカーインターフェイスは、すべての派生クラスを目的に基づいてカテゴリにタグ付けするため、「タグ」インターフェイスとも呼ばれます。たとえば、Cloneableインターフェイスを実装するすべてのクラスを複製できます(つまり、clone()メソッドをそれらで呼び出すことができます)。 Javaコンパイラは、clone()メソッドがクラスで呼び出され、クラスがCloneableインターフェイスを実装しているかどうかを確認します。たとえば、次のclone()メソッドの呼び出しについて考えてみます。オブジェクトo:
SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());
クラスSomeObjectがインターフェイスCloneableを実装していない場合(およびCloneableがSomeObjectが継承するスーパークラスのいずれによっても実装されていない場合)、コンパイラはこの行をエラーとしてマークします。これは、clone()メソッドは「Cloneable」タイプのオブジェクトによってのみ呼び出される可能性があるためです。したがって、Cloneableは空のインターフェイスですが、重要な目的を果たします。
registerNatives()
ネイティブメソッドはJVM自体に実装されています。 registerNatives()メソッドは何をしますか?
Why Java need some method without body to be called from static block.?
これは静的ブロックから呼び出されます。これは、インスタンスの作成時ではなく、クラスのロード時にこのメソッドを呼び出す必要があるためです。