Apakah antarmuka mewarisi dari kelas Object di java

157

Apakah antarmuka mewarisi dari Objectkelas di Jawa?

Jika tidak maka bagaimana kita dapat memanggil metode kelas objek pada contoh antarmuka

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

interface Employee {
}
kolam
sumber
@ EJP, secara teknis tidak masalah apa isi java / io / Serializable.class. Saya pikir Anda membingungkan Java Lang Spec dengan spesifikasi JVM.
aioobe
@aioobe Karena saya belum menyebutkan salah satu dari spesifikasi tersebut, saya tidak mengerti maksud Anda. Serializableadalah antarmuka, yang sesederhana mungkin; menjalankannya javapmemberi tahu Anda apa yang diwarisi darinya; dan itu ditentukan oleh Spesifikasi Bahasa Jawa. Jika Anda berpikir Spec JVM hadir di suatu tempat, silakan beri tahu kami.
Marquis of Lorne
2
@ EJP, pertanyaannya adalah tentang bahasa Jawa (yaitu Spesifikasi Bahasa Jawa). Apa yang pernah berisi java / io / Serializable.class terkait dengan apa yang dikatakan spesifikasi JVM. Secara teknis tidak ada jaminan bahwa ada korespondensi satu-ke-satu antara fitur dari dua spesifikasi.
aioobe
Saya menguraikan ini dalam posting blog baru-baru ini .
aioobe

Jawaban:

161

Apakah antarmuka mewarisi dari Objectkelas di Jawa?

Tidak, mereka tidak. Dan tidak ada antarmuka "root" yang umum yang secara implisit diwarisi oleh semua antarmuka (seperti dalam kasus dengan kelas). (*)

Jika tidak maka bagaimana kita dapat memanggil metode kelas objek pada contoh antarmuka

Antarmuka secara implisit menyatakan satu metode untuk setiap metode publik di Object. Jadi equalsmetode ini secara implisit dinyatakan sebagai anggota dalam suatu antarmuka (kecuali jika sudah mewarisi dari superinterface).

Ini dijelaskan secara rinci dalam Spesifikasi Bahasa Jawa, § 9.2 Anggota Antarmuka .

9.2 Anggota Antarmuka

[...]

  • Jika sebuah antarmuka tidak memiliki superinterfaces langsung, maka antarmuka secara implisit menyatakan metode anggota abstrak publik m dengan tanda tangan s , tipe kembali r , dan melempar klausa t yang sesuai dengan setiap metode instance publik m dengan tanda tangan s , tipe kembali r , dan melempar klausa t dideklarasikan dalamObject , kecuali metode dengan tanda tangan yang sama, tipe pengembalian yang sama, dan klausa lemparan yang kompatibel secara eksplisit dinyatakan oleh antarmuka.

[...]


Posting ini telah ditulis ulang sebagai artikel di sini .


(*) Perhatikan bahwa gagasan menjadi subtipe tidak sama dengan warisan dari : Antarmuka tanpa antarmuka super memang subtipe dari Object( § 4.10.2. Subtipe di antara Kelas dan Jenis Antarmuka ) meskipun mereka tidak mewarisi dari Object.

aioobe
sumber
1
@aioobe Jika kita mengimplementasikan antarmuka apa pun, mengapa kita tidak memberikan implementasi metode "equals" di kelas yang mengimplementasikan antarmuka itu. Menurut konsep saya, kita harus mengimplementasikan metode antarmuka dalam mengimplementasikan kelas kalau tidak kelas akan abstrak.
Vikas Mangal
1
Anda tidak perlu (kembali) menerapkan metode yang diwariskan. Lihatlah contoh ini . Dengan kata lain, equals sudah didefinisikan dan diwarisi ke kelas yang mengimplementasikan antarmuka.
aioobe
3
Saya mengerti maksudnya di sini. Tapi satu pertanyaan - mengapa kita membutuhkan ini? Apa bedanya jika metode Objectkelas tidak akan dideklarasikan di antarmuka?
Vikas Mangal
2
Jika kami tidak memiliki ini, program dalam pertanyaan tidak akan dikompilasi. Ada pada equalsmetode di Employeeantarmuka.
aioobe
1
Pertanyaan dan jawaban ini masih mengingatkan saya bahwa bahkan setelah pengalaman saya harus fokus pada membuat dasar-dasar saya kuat.
Anand j. Kadhi
13

Object adalah supertype dari semua antarmuka [1]

Namun, antarmuka tidak implements, extendsatau, "mewarisi dari" Object .

JLS memiliki klausa khusus untuk menambahkan Objectmetode ke antarmuka [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

tak dapat disangkal
sumber
Itu jawaban yang paling akurat. Seharusnya yang diterima. Misalnya metode yang mengambil java.lang.Objectakan juga menerima referensi dari semua jenis antarmuka. Selain itu, Anda dapat menampilkan antarmuka secara Objectimplisit tanpa kesalahan kompiler.
nme
12

Sebenarnya ada bidang superclass di setiap .classfile, termasuk yang mewakili antarmuka.

Untuk antarmuka selalu menunjuk ke java.lang.Object. Tapi itu tidak digunakan untuk apa pun.

Cara lain untuk melihatnya adalah:

interface MyInterface {
    // ...
}

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

Di sini para pemain (Object) paramselalu valid, yang menyiratkan bahwa setiap jenis antarmuka adalah subtipe dari java.lang.Object.

menemukan
sumber
4
File .class adalah artefak dari file .java. Untuk berdebat mengapa sesuatu bekerja dalam bahasa Java dengan melihat file .class yang dihasilkan adalah alasan mundur.
aioobe
Object obj = (Object) param; tidak membuang kesalahan kompilasi. Tetapi metode MyInterface (publik) tidak terlihat keberatan. Karenanya tidak dapat berasumsi MyInterface adalah setiap jenis antarmuka adalah subtipe dari java.lang.Object
sabarinathan u
5

Itu karena employee e = ...membaca bahwa ada kelas yang mengimplementasikan employee , dan ditugaskan ke variabel e. Setiap kelas yang mengimplementasikan antarmuka memperluas Object secara implisit, maka ketika Anda melakukannya e.equals(null), bahasa tahu bahwa Anda memiliki kelas yang merupakan subtipe dari employee.

JVM akan melakukan pengecekan runtime untuk kode Anda (yaitu melempar NullPointerException).

Buhake Sindi
sumber
3

Apakah antarmuka mewarisi kelas Objek, bagaimana kita bisa mengakses metode kelas objek melalui referensi tipe antarmuka
Tidak antarmuka tidak mewarisi Objectkelas, tetapi menyediakan aksesibilitas ke semua metode Objectkelas. Anggota antarmuka adalah:

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

mendeklarasikan metode anggota abstrak publik yang sesuai dengan setiap metode instance publik yang dinyatakan dalam Objectkelas .
Ini adalah kesalahan saat kompilasi jika antarmuka secara eksplisit menyatakan metode seperti m dalam kasus di mana m dinyatakan finaldalam Object.

Sekarang jelas bahwa semua superinterface memiliki abstractmetode anggota yang sesuai dengan setiap publicmetode instance yang dideklarasikan pada Object.

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

Sheo
sumber
0

Setiap kelas yang mengimplementasikan antarmuka apa pun juga berasal dari Objectdefinisi.

jabal
sumber
0

"Semua tipe referensi mewarisi dari java.lang.Object . Kelas, enum, array, dan antarmuka adalah semua tipe referensi. "

Dikutip dari: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Kalimat kedua menjadi jelas.

dalvarezmartinez1
sumber
Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: ia tidak mengatakan antarmuka mewarisi dari Object. Hanya Kelas, enum, dan array.
Nomor 945
Mereka mengubahnya :)
dalvarezmartinez1
Bahkan jika "mereka mengubahnya" (yang saya ragu), tutorialnya bisa salah. Referensi normatif adalah Spesifikasi Bahasa Jawa (JLS).
Lew Bloch