インターフェイスはJavaのObject
クラスを継承しますか?
いいえの場合、どのようにしてインターフェイスインスタンスのオブジェクトクラスのメソッドを呼び出すことができますか
public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
インターフェイスはJavaの
Object
クラスから継承しますか?
いいえ、そうではありません。また、(クラスの場合のように)すべてのインターフェイスに暗黙的に継承される共通の「ルート」インターフェイスはありません。(*)
いいえの場合、インターフェイスインスタンスでオブジェクトクラスのメソッドを呼び出す方法
インターフェイスは、Object
の各パブリックメソッドに対して1つのメソッドを暗黙的に宣言しました。したがって、equals
メソッドは、インターフェイスのメンバーとして暗黙的に宣言されます(スーパーインターフェイスから既に継承している場合を除く)。
これについては、Java Language Specification、 §9.2 Interface Members で詳しく説明されています。
9.2インターフェースメンバ
[...]
- インターフェイスに直接スーパーインターフェイスがない場合、、インターフェイスは暗黙的にパブリック抽象メンバーメソッドを宣言しますm署名付きs、戻り値の型- r、およびthrows句t署名付きの各パブリックインスタンスメソッドmに対応s、戻り型r、およびthrows句tは、
Object
で宣言されます。ただし、同じシグネチャ、同じ戻り値型、および互換性のあるthrows句を持つメソッドがインターフェイスによって明示的に宣言されている場合を除きます。[...]
この投稿は記事として書き直されました here 。
(*)subtype ofであるという概念はinherits fromと同等ではないことに注意してください。スーパーインターフェースを持たないインターフェースは、確かにObject
のサブタイプです(- §4.10.2。クラス型とインターフェース型の間のサブタイプ )Object
を継承していなくても。
実際には、すべての.class
ファイルに、インターフェイスを表すものを含むスーパークラスフィールドがあります。
インターフェイスの場合、常にJava.lang.Object
を指します。しかし、それは何にも使用されません。
別の見方は次のとおりです。
interface MyInterface {
// ...
}
public myMethod(MyInterface param) {
Object obj = (Object) param;
// ...
}
ここでは、キャスト(Object) param
は常に有効です。これは、すべてのインターフェイスタイプがJava.lang.Object
のサブタイプであることを意味します。
Object
は任意のインターフェイスのスーパータイプです[1]
ただし、インターフェイスはimplements
、extends
、または "inherit from"Object
。
JLSには、Object
メソッドをインターフェイスに追加する特別な句があります[2]
[1] http://Java.Sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2
[2] http://Java.Sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2
これは、_employee e = ...
_がimplementsemployee
であり、変数e
に割り当てられているクラスがあることを読み取るためです。インターフェイスを実装するすべてのクラスは暗黙的にObjectを拡張するため、e.equals(null)
を実行すると、言語はemployee
のサブタイプであるクラスがあることを認識します。
JVMは、コードの実行時チェックを実行します(つまり、NullPointerException
をスローします)。
インターフェイスはオブジェクトクラスを継承していますが、インターフェイスタイプの参照を介してオブジェクトクラスのメソッドにアクセスするにはどうすればよいですか
インターフェイスはObject
クラスを継承しませんが、Object
クラスのすべてのメソッドへのアクセシビリティを提供します。インターフェイスのメンバーは次のとおりです。
Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly
は、Object
classで宣言された各パブリックインスタンスメソッドに対応するパブリック抽象メンバーメソッドを宣言します。
mがfinal
でObject
であると宣言されている場合に、インターフェイスがそのようなメソッドmを明示的に宣言すると、コンパイル時エラーになります。
これで、すべてのスーパーインターフェイスに、abstract
で宣言された各public
インスタンスメソッドに対応するObject
メンバーメソッドがあることが明らかになりました。
ソース: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
インターフェイスを実装するクラスも、定義によりObject
から派生します。
「参照型はすべてJava.lang.Objectを継承します。クラス、列挙、配列、およびインターフェイスはすべて参照ですタイプ)
引用元: http://docs.Oracle.com/javase/tutorial/reflect/class/index.html 明確にするための2番目の文。