web-dev-qa-db-ja.com

javaのObjectクラスからインターフェイスを継承しますか

インターフェイスはJavaのObjectクラスを継承しますか?

いいえの場合、どのようにしてインターフェイスインスタンスのオブジェクトクラスのメソッドを呼び出すことができますか

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}
144
ponds

インターフェイスは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を継承していなくても。

151
aioobe

実際には、すべての.classファイルに、インターフェイスを表すものを含むスーパークラスフィールドがあります。

インターフェイスの場合、常にJava.lang.Objectを指します。しかし、それは何にも使用されません。

別の見方は次のとおりです。

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

ここでは、キャスト(Object) paramは常に有効です。これは、すべてのインターフェイスタイプがJava.lang.Objectのサブタイプであることを意味します。

11
finnw

Objectは任意のインターフェイスのスーパータイプです[1]

ただし、インターフェイスはimplementsextends、または "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

9
irreputable

これは、_employee e = ..._がimplementsemployeeであり、変数eに割り当てられているクラスがあることを読み取るためです。インターフェイスを実装するすべてのクラスは暗黙的にObjectを拡張するため、e.equals(null)を実行すると、言語はemployeeのサブタイプであるクラスがあることを認識します。

JVMは、コードの実行時チェックを実行します(つまり、NullPointerExceptionをスローします)。

4
Buhake Sindi

インターフェイスはオブジェクトクラスを継承していますが、インターフェイスタイプの参照を介してオブジェクトクラスのメソッドにアクセスするにはどうすればよいですか
インターフェイスは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がfinalObjectであると宣言されている場合に、インターフェイスがそのようなメソッドmを明示的に宣言すると、コンパイル時エラーになります。

これで、すべてのスーパーインターフェイスに、abstractで宣言された各publicインスタンスメソッドに対応するObjectメンバーメソッドがあることが明らかになりました。

ソース: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html

3
Sheo

インターフェイスを実装するクラスも、定義によりObjectから派生します。

0
jabal

参照型はすべてJava.lang.Objectを継承します。クラス、列挙、配列、およびインターフェイスはすべて参照ですタイプ

引用元: http://docs.Oracle.com/javase/tutorial/reflect/class/index.html 明確にするための2番目の文。

0