Czy interfejsy dziedziczą z Object
klasy w Javie?
Jeśli nie, to w jaki sposób możemy wywołać metodę klasy obiektu na instancji interfejsu
public class Test {
public static void main(String[] args) {
Employee e = null;
e.equals(null);
}
}
interface Employee {
}
java
inheritance
interface
stawy
źródło
źródło
Serializable
jest interfejsem, najprostszym z możliwych; bieganiejavap
po nim mówi ci, z czego dziedziczy; i jest to podyktowane specyfikacją języka Java. Jeśli sądzisz, że gdzieś w grę wchodzi specyfikacja JVM, proszę nas oświecić.Odpowiedzi:
Nie, nie robią. I nie ma też wspólnego interfejsu "root", domyślnie dziedziczonego przez wszystkie interfejsy (jak w przypadku klas). (*)
Interfejs niejawnie zadeklarował jedną metodę dla każdej metody publicznej w programie
Object
. Więcequals
sposób metoda jest niejawnie zadeklarowana jako element członkowski w interfejsie (chyba że dziedziczy ją już z superinterfejsu).Jest to szczegółowo wyjaśnione w specyfikacji języka Java, § 9.2 Członkowie interfejsu .
Ten post został przepisany jako artykuł tutaj .
(*) Należy zauważyć, że pojęcie bycia podtypem nie jest równoznaczne z dziedziczeniem po : Interfejsy bez super interfejsu są rzeczywiście podtypami
Object
( § 4.10.2. Podtypy między typami klas i interfejsów ), mimo że nie dziedziczą poObject
.źródło
Object
klasy nie zostały zadeklarowane w interfejsie?equals
metodaEmployee
.Object
jest nadtypem dowolnego interfejsu [1]Jednak interfejs nie robi
implements
,extends
albo, „dziedziczy z”Object
.JLS ma specjalną klauzulę do dodawania
Object
metod do interfejsów [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
źródło
java.lang.Object
przyjmie również referencje dowolnego typu interfejsu. Co więcej, możesz rzutować interfejs naObject
niejawnie bez żadnego błędu kompilatora.W rzeczywistości w każdym
.class
pliku znajduje się pole nadklasy , łącznie z tymi, które reprezentują interfejsy.W przypadku interfejsu zawsze wskazuje
java.lang.Object
. Ale to nie jest używane do niczego.Można na to inaczej spojrzeć:
Tutaj rzutowanie
(Object) param
jest zawsze prawidłowe, co oznacza, że każdy typ interfejsu jest podtypemjava.lang.Object
.źródło
Dzieje się tak, ponieważ
employee e = ...
czyta, że istnieje klasa, która implementujeemployee
i jest przypisana do zmienneje
. Każda klasa, która implementuje interfejs, rozszerza Object niejawnie, więc kiedy to robisze.equals(null)
, język wie, że masz klasę, która jest podtypememployee
.JVM będzie sprawdzać kod w czasie wykonywania (np. Rzut
NullPointerException
).źródło
Czy interfejs dziedziczy klasę Object, w jaki sposób możemy uzyskać dostęp do metod klasy obiektu poprzez odniesienie do typu interfejsu?
No Interface nie dziedziczy
Object
klasy, ale zapewnia dostęp do wszystkich metodObject
klasy. Członkami interfejsu są:deklaruje publiczną abstrakcyjną metodę składową odpowiadającą każdej metodzie wystąpienia publicznego zadeklarowanej w
Object
klasie .Jest to błąd czasu kompilacji, jeśli interfejs jawnie deklaruje taką metodę m w przypadku, gdy zadeklarowano, że m znajduje się
final
wObject
.Teraz jest jasne, że wszystkie superinterfejsy mają
abstract
metodę składową odpowiadającą każdejpublic
metodzie instancji zadeklarowanej wObject
.źródło: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
źródło
Z
Object
definicji również wywodzi się każda klasa implementująca dowolny interfejs .źródło
„ Wszystkie typy odwołań dziedziczą po java.lang.Object . Wszystkie klasy, wyliczenia, tablice i interfejsy są typami odwołań ”.
Cytat z: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Drugie zdanie powinno być jasne.
źródło
Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types
: nie mówi, że interfejs dziedziczy po Object. Tylko klasy, wyliczenia i tablice.