Arabirimler Java'daki Object sınıfından miras alır


157

Arabirimler ObjectJava'daki sınıftan miras alır ?

Hayır ise, arayüz örneğinde nesne sınıfı yöntemini nasıl çağırabiliriz?

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

interface Employee {
}

@EJP, teknik olarak konuşursak, java / io / Serializable.class'ın içerdiği önemli değildir. Bence Java Lang Spec'i JVM spec ile karıştırıyorsunuz.
aioobe

@aioobe Bu özelliklerin hiçbirinden bahsetmediğim için ne anlama geldiğini anlamıyorum. Serializablebir arayüz, mümkün olan en basit; javapüzerinde koşmak size neyin miras aldığını söyler; ve bu Java Dil Spesifikasyonu tarafından belirlenir. JVM Spec'in bir yere girdiğini düşünüyorsanız lütfen bizi aydınlatın.
Lorne Marquis,

2
@EJP, soru Java dili ile ilgilidir (yani Java Dil Spesifikasyonu). Java / io / Serializable.class'ın içerdiği şey, JVM spesifikasyonunun söylediği şeyle ilgilidir. Teknik olarak konuşursak, iki spesifikasyonun özellikleri arasında bire bir yazışma olduğuna dair bir garanti yoktur.
aioobe

Bu konuyu yakın zamanda bir blog yazısında ele aldım .
aioobe

Yanıtlar:


161

Arabirimler ObjectJava'daki sınıftan miras alır ?

Hayır. Ve bu konu için (sınıflarda olduğu gibi) tüm arabirimler tarafından dolaylı olarak miras alınan ortak bir "kök" arabirimi yoktur. (*)

Hayır ise, arayüz örneğinde nesne sınıfı yöntemini nasıl çağırabiliriz?

Bir arabirim, içindeki her genel yöntem için dolaylı olarak bir yöntem bildirdi Object. Böylece equalsyöntem, dolaylı olarak bir arabirimde üye olarak bildirilir (zaten bir üst arayüzden devralmadığı sürece).

Bu, Java Dil Spesifikasyonu, § 9.2 Arayüz Üyeleri'nde ayrıntılı olarak açıklanmaktadır .

9.2 Arayüz Üyeleri

[...]

  • Bir arabirim doğrudan superinterfaces varsa, o zaman arayüzü örtülü bir ortak arka elemanı yöntemi bildirir m imza ile s , dönüş türü r ve maddesi atar t , her imza ile ortak örnek yöntemi m'ye karşılık gelen s , dönüş türü r ve maddesi atar t bildirilenObject aynı imza, aynı dönüş türü ve uyumlu bir maddeyi atar ile bir metot açıkça arayüzü tarafından bildirilmiş olmadıkça,.

[...]


Bu yazı burada bir makale olarak yeniden yazılmıştır .


(*) Bir varlık kavramı o Not alt tipi denk olmayan devraldığı : hayır süper arayüzü ile Arayüz gerçekten alt tipleri vardır Object( . § 4.10.2 Sınıf ve Arayüz Tipleri arasında alttiplendirmesinde ) onlar devralan olmasa bile Object.


1
@aioobe Herhangi bir arabirim uygularsak, neden bu arabirimi uygulayan sınıfta "eşittir" yönteminin uygulanmasını vermiyoruz. Kavramlarıma göre, sınıfın uygulanmasında arayüz yöntemlerini uygulamalıyız, aksi takdirde sınıf soyut olacaktır.
Vikas Mangal

1
Kalıtsal yöntemleri (yeniden) uygulamanız gerekmez. Bu örneğe bir göz atın . Başka bir deyişle, equals zaten tanımlanmış ve arabirimi uygulayan sınıfa aktarılmıştır.
aioobe

3
Burada anladım. Ama bir soru - buna neden ihtiyacımız var? ObjectSınıf yöntemleri arayüzde açıklanmasaydı ne fark ederdi ki ?
Vikas Mangal

2
Buna sahip olmasaydık, söz konusu program derlenmeyecekti. Arayüzde equalsyöntem var Employee.
aioobe

1
Bu soru ve cevap hala deneyimlerden sonra bile temellerimi güçlendirmeye odaklanmam gerektiğini hatırlatıyor.
Anand j. Kadhi

13

Object herhangi bir arayüzün bir süpertipidir [1]

Ancak, bir arayüz implements,extends ya, "adresinden devralır" Object .

JLS'nin Objectarayüzlere yöntem eklemek için özel bir maddesi vardır [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


Bu en doğru cevap. Kabul edilen olmalı. Örneğin, a alan bir yöntem java.lang.Object, herhangi bir arabirim türünün referansını da kabul edecektir. Üstelik Objectherhangi bir derleyici hatası olmadan dolaylı olarak arabirim oluşturabilirsiniz .
nme

12

Aslında her .classdosyada, ara yüzleri temsil edenler de dahil olmak üzere bir üst sınıf alan vardır .

Bir arayüz için her zaman işaret eder java.lang.Object. Ama bu hiçbir şey için kullanılmaz.

Bakmanın başka bir yolu:

interface MyInterface {
    // ...
}

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

Burada kadro (Object) paramher zaman geçerlidir, bu da her arabirim türünün bir alt türü olduğunu gösterir java.lang.Object.


4
.Class dosyası, .java dosyasının bir eseridir. Ortaya çıkan .class dosyasına bakarak bir şeyin neden Java dilinde çalıştığını tartışmak geriye dönük bir muhakemedir.
aioobe

Nesne obj = (Nesne) param; derleme hatası atmaz. Ancak MyInterface'in yöntemleri (herkese açık) objeye görünür değildir. Bu nedenle,
MyInterface'in

5

Çünkü değişken uygulayan ve değişkene atanan employee e = ...bir sınıf olduğunu okur . Bir arabirimi uygulayan her sınıf Object'i örtük olarak genişletir, dolayısıyla bunu yaptığınızda , dil bir alt türü olan bir sınıfınız olduğunu bilir . employeeee.equals(null)employee

JVM kodunuz için çalışma zamanı kontrolü yapacaktır (örn. Atma NullPointerException).


3

Interface Object sınıfını devralır, bir arabirim türü başvurusu ile nesne sınıfı yöntemlerine nasıl erişebiliriz
No Interface Objectsınıfı devralmaz , ancak tüm Objectsınıf yöntemlerine erişilebilirlik sağlar . Bir arayüzün üyeleri:

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

Objectsınıfta bildirilen her bir genel yönetim ortamı yöntemine karşılık gelen bir genel soyut üye yöntemini bildirir .
Arayüz açıkça m olduğu bildirildi durumunda böyle bir yöntem m ilan etmesi halinde bir derleme zamanı hatası finaliçinde Object.

Artık tüm üst yüzeyin beyan edilen abstracther publicörnek yöntemine karşılık gelen üye yöntemi olduğu açıktır Object.

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


0

Herhangi bir arabirimi uygulayan herhangi bir sınıf da Objecttanımdan türetilir .


0

" Referans türlerinin tümü java.lang.Object kaynağından devralır . Sınıflar, sıralamalar, diziler ve arabirimlerin tümü referans türleridir. "

Alıntı sahibi: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Net olmak için ikinci cümle.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: arabirimin Object'ten miras aldığını söylemez. Sadece Sınıflar, sıralamalar ve diziler.
Sayı 945

Onlar değişti :)
dalvarezmartinez1

"Onlar değişti" bile (ki şüpheliyim), öğretici yanlış olabilir. Normatif referans Java Dil Spesifikasyonu'dur (JLS).
Lew Bloch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.