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


157

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

いいえの場合、インターフェイスインスタンスでオブジェクトクラスのメソッドを呼び出す方法

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

interface Employee {
}

56
+1、すばらしい質問。
aioobe

@EJP、技術的に言えば、java / io / Serializable.classに何が含まれているかは問題ではありません。Java Lang仕様とJVM仕様を混同していると思います。
aioobe 2012年

@aioobeどちらの仕様についても触れていないので、理解できません。Serializableインターフェースであり、可能な限り簡単です。それを実行javapすると、継承元がわかります。これは、Java言語仕様によって規定されています。JVM仕様がどこかに入ってくると思われる場合は、私たちに知らせてください。
ローンの侯爵2012年

2
@EJP、問題はJava言語(つまり、Java言語仕様)に関するものです。java / io / Serializable.classに含まれるものは、JVM仕様の内容に関連しています。技術的に言えば、2つの仕様の機能が1対1で対応しているという保証はありません。
aioobe 2013年

私は最近のブログ投稿でこれについて詳しく説明しました。
aioobe 2016

回答:


161

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

いいえ、ありません。また、すべてのインターフェースによって暗黙的に継承される共通の「ルート」インターフェースもありません(クラスの場合のように)。(*)

いいえの場合、インターフェイスインスタンスでオブジェクトクラスのメソッドを呼び出す方法

インターフェイスは、の各パ​​ブリックメソッドに対して1つのメソッドを暗黙的に宣言しましたObject。したがって、equalsメソッドはインターフェースのメンバーとして暗黙的に宣言されます(スーパーインターフェースからすでに継承している場合を除く)。

これについては、Java言語仕様の9.2インターフェースメンバーで詳しく説明されています。

9.2インターフェイスメンバー

[...]

  • インターフェースは直接的なスーパを有していない場合は、次にインタフェースは、暗黙的にパブリック抽象メンバメソッド宣言M署名付きS、リターンタイプRを、そして句スローTを各署名とパブリックインスタンスメソッドmに対応するS、リターンタイプR、及び文節スローTをで宣言されますObject。ただし、同じシグネチャ、同じ戻り値の型、および互換性のあるthrows句を持つメソッドがインターフェイスによって明示的に宣言されている場合を除きます。

[...]


この投稿は、こちらの記事に書き直されました。


(*)のサブタイプであるという概念は、継承元と同等はないことに注意してください。スーパーインターフェースのないインターフェースは、から継承していなくても、Object§4.10.2。クラスとインターフェースタイプ間のサブタイプ化)のサブタイプですObject


1
@aioobeインターフェースを実装する場合は、そのインターフェースを実装しているクラスに「equals」メソッドの実装を指定しないでください。私の概念によれば、クラスを実装する際にインターフェイスのメソッドを実装する必要があります。そうしないと、クラスは抽象になります。
Vikas Mangal

1
継承されたメソッドを(再)実装する必要はありません。この例を見てください。つまり、equalsはすでに定義されており、インターフェースを実装するクラスに継承されています。
aioobe

3
ここで要点を得た。しかし、1つの質問-なぜこれが必要なのでしょうか。Objectクラスのメソッドがインターフェースで宣言されていなかった場合、どのような違いがありましたか?
Vikas Mangal 2014

2
これがなければ、問題のプログラムはコンパイルされません。インターフェースにはon equalsメソッドがありEmployeeます。
aioobe 14

1
この質問と回答は、経験を積んだ後でも、基本を強化することに集中する必要があることを思い出させます。
Anand j。カディ

13

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

ただし、インターフェースはimplementsextendsまたは、「から継承」 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


それが最も正確な答えです。受け入れられるものでなければなりません。たとえば、aを取るメソッドは、java.lang.Object任意のインターフェイスタイプの参照も受け入れます。さらにObject、コンパイラエラーなしでインターフェイスを暗黙的にキャストできます。
nme

12

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

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

それを見る別の方法は次のとおりです。

interface MyInterface {
    // ...
}

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

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


4
.classファイルは、.javaファイルのアーティファクトです。結果の.classファイルを確認することによってJava言語で何かが機能する理由を主張することは、後方推論です。
aioobe 14

オブジェクトobj =(オブジェクト)パラメータ; コンパイルエラーをスローしません。しかし、MyInterfaceのメソッド(パブリック)はobjからは見えません。したがって、MyInterfaceがすべてのインターフェースタイプがjava.lang.Objectのサブタイプであると想定することはできません
sabarinathan u

5

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

JVMは、コードのランタイムチェックを実行します(つまり、throw NullPointerException)。


回答は命名規則に従っている必要があります。
Lew Bloch

3

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

これで、すべてのスーパーインターフェイスに、で宣言されたabstractpublicインスタンスメソッドに対応するメンバーメソッドがあることがわかりますObject

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


0

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


0

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

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


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types:それはインターフェイスがオブジェクトから継承するとは言いません。クラス、列挙、配列のみ。
-Number945

彼らはそれを変更しました:)
dalvarezmartinez1

「彼らがそれを変えた」(私​​はそれを疑っている)場合でも、チュートリアルは間違っている可能性があります。規範的な参照は、Java言語仕様(JLS)です。
Lew Bloch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.