Le interfacce ereditano dalla classe Object in Java


157

Le interfacce ereditano dalla Objectclasse in Java?

In caso contrario, come possiamo chiamare il metodo della classe di oggetti sull'istanza dell'interfaccia

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

interface Employee {
}

@EJP, tecnicamente parlando non importa cosa contiene java / io / Serializable.class. Penso che stai confondendo le specifiche Java Lang con le specifiche JVM.
aioobe,

@aioobe Dato che non ho menzionato nessuna di queste specifiche, non capisco il tuo punto. Serializableè un'interfaccia, la più semplice possibile; correre javapsu di esso ti dice da cosa eredita; e questo è dettato dalla specifica del linguaggio Java. Se ritieni che le specifiche JVM vengano inserite da qualche parte, ti preghiamo di illuminarci.
Marchese di Lorne,

2
@EJP, la domanda riguarda il linguaggio Java (ovvero le specifiche del linguaggio Java). Ciò che mai contiene java / io / Serializable.class è correlato a ciò che dice la specifica JVM. Tecnicamente parlando non esiste alcuna garanzia che esista una corrispondenza individuale tra le caratteristiche delle due specifiche.
Aioobe,

Ne ho parlato in un recente post sul blog .
aioobe,

Risposte:


161

Le interfacce ereditano dalla Objectclasse in Java?

No, non lo fanno. E non esiste un'interfaccia "root" comune ereditata implicitamente da tutte le interfacce (come nel caso delle classi). (*)

In caso contrario, come possiamo chiamare il metodo della classe di oggetti sull'istanza dell'interfaccia

Un'interfaccia ha implicitamente dichiarato un metodo per ogni metodo pubblico in Object. Pertanto, il equalsmetodo viene implicitamente dichiarato come membro in un'interfaccia (a meno che non lo erediti già da una superinterfaccia).

Questo è spiegato in dettaglio nella specifica del linguaggio Java, § 9.2 Membri dell'interfaccia .

9.2 Membri dell'interfaccia

[...]

  • Se un'interfaccia non ha superinterfacce dirette, l'interfaccia dichiara implicitamente un metodo di membro astratto pubblico m con firma s , tipo di ritorno r , e genera la clausola t corrispondente a ciascun metodo di istanza pubblica m con firma s , tipo di ritorno r e clausola di lancio t dichiarato inObject , a meno che un metodo con la stessa firma, lo stesso tipo restituito e una clausola plausibile compatibile sia esplicitamente dichiarato dall'interfaccia.

[...]


Questo post è stato riscritto come articolo qui .


(*) Notare che l'idea di essere un sottotipo di non equivale a eredita da : Le interfacce senza super interfaccia sono in effetti sottotipi di Object( § 4.10.2. Sottotipo tra classi e tipi di interfaccia ) anche se non ereditano da Object.


1
@aioobe Se implementiamo qualche interfaccia, allora perché non diamo l'implementazione del metodo "uguale a" nella classe che sta implementando quell'interfaccia. Secondo i miei concetti, dobbiamo implementare i metodi di interfaccia nell'implementazione della classe, altrimenti la classe sarà astratta.
Vikas Mangal,

1
Non è necessario (ri) implementare metodi ereditati. Dai un'occhiata a questo esempio . In altre parole, equals è già definito ed ereditato dalla classe che implementa l'interfaccia.
aioobe,

3
Ho capito il punto qui. Ma una domanda: perché ne abbiamo bisogno? Che differenza avrebbe fatto se i metodi di Objectclasse non fossero stati dichiarati nell'interfaccia?
Vikas Mangal,

2
Se non avessimo questo, il programma nella domanda non verrebbe compilato. C'è un equalsmetodo Employeenell'interfaccia.
Aioobe,

1
Questa domanda e risposta mi ricorda ancora che, anche dopo l'esperienza, dovrei concentrarmi sul rafforzare le mie basi.
Anand j. Kadhi il

13

Object è un supertipo di qualsiasi interfaccia [1]

Tuttavia, l'interfaccia non lo fa implements, extendso, "Eredita da" Object .

JLS ha una clausola speciale per aggiungere Objectmetodi nelle interfacce [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


Questa è la risposta più accurata. Dovrebbe essere quello accettato. Ad esempio, un metodo che accetta un java.lang.Objectaccetta anche un riferimento di qualsiasi tipo di interfaccia. Inoltre è possibile trasmettere l'interfaccia in modo Objectimplicito senza alcun errore del compilatore.
dal

12

In realtà esiste un campo superclasse in ogni .classfile, inclusi quelli che rappresentano le interfacce.

Per un'interfaccia a cui punta sempre java.lang.Object. Ma questo non è usato per niente.

Un altro modo di vederlo è:

interface MyInterface {
    // ...
}

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

Qui il cast (Object) paramè sempre valido, il che implica che ogni tipo di interfaccia è un sottotipo di java.lang.Object.


4
Il file .class è un artefatto del file .java. Discutere sul perché qualcosa funzioni in linguaggio Java guardando il file .class risultante è un ragionamento all'indietro.
Aioobe,

Object obj = (Object) param; non genera errori di compilazione. Ma i metodi di MyInterface (pubblico) non sono visibili a obj. Pertanto non posso presumere che MyInterface sia ogni tipo di interfaccia è un sottotipo di java.lang.Object
sabarinathan u

5

Questo perché employee e = ...legge che esiste una classe che implementa employee ed è assegnata alla variabile e. Ogni classe che implementa un'interfaccia estende implicitamente Object, quindi quando lo fai e.equals(null), il linguaggio sa che hai una classe che è un sottotipo di employee.

La JVM eseguirà il controllo del runtime per il tuo codice (ad es. Lancio NullPointerException).


3

Se l'interfaccia eredita la classe di oggetti, come possiamo accedere ai metodi della classe di oggetti attraverso un riferimento al tipo di interfaccia
No L'interfaccia non eredita la Objectclasse, ma fornisce accessibilità a tutti i metodi di Objectclasse. I membri di un'interfaccia sono:

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

dichiara un metodo membro astratto pubblico corrispondente a ciascun metodo di istanza pubblica dichiarato in Objectclasse .
È un errore in fase di compilazione se l'interfaccia dichiara esplicitamente tale metodo m nel caso in cui m sia dichiarato finalin Object.

Ora è chiaro che tutta la superinterfaccia ha un abstractmetodo membro corrispondente a ciascun publicmetodo di istanza dichiarato in Object.

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


0

Qualsiasi classe che implementa qualsiasi interfaccia è anch'essa derivata Objectper definizione.


0

" Tutti i tipi di riferimento ereditano da java.lang.Object . Classi, enumerazioni, array e interfacce sono tutti tipi di riferimento. "

Citato da: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Seconda frase da chiarire.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: non dice che l'interfaccia eredita da Object. Solo classi, enumerazioni e matrici.
Numero 945

L'hanno cambiato :)
dalvarezmartinez1

Anche se "l'hanno cambiato" (che dubito), il tutorial può essere sbagliato. Il riferimento normativo è la Java Language Specification (JLS).
Lew Bloch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.