Les interfaces héritent-elles de la classe Object en Java

157

Les interfaces héritent-elles de la Objectclasse en Java?

Si non, comment nous pouvons appeler la méthode de la classe d'objet sur l'instance d'interface

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

interface Employee {
}
étangs
la source
@EJP, techniquement parlant, peu importe ce que contient java / io / Serializable.class. Je pense que vous confondez la spécification Java Lang avec la spécification JVM.
aioobe
@aioobe Comme je n'ai mentionné aucune de ces spécifications, je ne comprends pas votre point. Serializableest une interface, la plus simple possible; courir javapdessus vous dit de quoi il hérite; et cela est dicté par la spécification du langage Java. Si vous pensez que la spécification JVM entre quelque part, veuillez nous éclairer.
Marquis of Lorne
2
@EJP, la question concerne le langage Java (c'est-à-dire la spécification du langage Java). Ce que java / io / Serializable.class contient est lié à ce que dit la spécification JVM. Techniquement parlant, il n'y a aucune garantie qu'il y ait une correspondance biunivoque entre les caractéristiques des deux spécifications.
aioobe
J'ai développé cela dans un récent article de blog .
aioobe

Réponses:

161

Les interfaces héritent-elles de la Objectclasse en Java?

Non, ils ne le font pas. Et il n'y a pas non plus d'interface "racine" commune héritée implicitement par toutes les interfaces (comme dans le cas des classes) d'ailleurs. (*)

Si non, comment nous pouvons appeler la méthode de la classe d'objet sur l'instance d'interface

Une interface a déclaré implicitement une méthode pour chaque méthode publique dans Object. Ainsi, la equalsméthode est implicitement déclarée en tant que membre dans une interface (sauf si elle hérite déjà d'une super-interface).

Ceci est expliqué en détail dans la spécification du langage Java, § 9.2 Membres de l'interface .

9.2 Membres de l'interface

[...]

  • Si une interface n'a pas de super-interfaces directes, alors l'interface déclare implicitement une méthode membre abstraite publique m avec la signature s , le type de retour r et la clause t correspondant à chaque méthode d'instance publique m avec la signature s , le type de retour r et la clause t déclarée dansObject , sauf si une méthode avec la même signature, le même type de retour et une clause throws compatible est explicitement déclarée par l'interface.

[...]


Cet article a été réécrit sous forme d'article ici .


(*) Notez que la notion d'être un sous - type de n'est pas équivalent à hérite de : Les interfaces sans super-interface sont en effet des sous-types de Object( § 4.10.2. Sous-typage parmi les types de classe et d'interface ) même si elles n'héritent pas de Object.

aioobe
la source
1
@aioobe Si nous implémentons une interface, alors pourquoi ne pas donner l'implémentation de la méthode "equals" dans la classe qui implémente cette interface. Selon mes concepts, nous devons implémenter les méthodes d'interface dans l'implémentation de la classe sinon la classe sera abstraite.
Vikas Mangal
1
Vous n'avez pas besoin de (ré) implémenter des méthodes héritées. Jetez un œil à cet exemple . En d'autres termes, equals est déjà défini et hérité de la classe implémentant l'interface.
aioobe
3
J'ai compris ici. Mais une question: pourquoi avons-nous besoin de cela? Quelle différence cela aurait-il fait si les méthodes de Objectclasse n'avaient pas été déclarées dans l'interface?
Vikas Mangal
2
Si nous n'avions pas cela, le programme de la question ne se compilerait pas. Il y a une equalsméthode dans l' Employeeinterface.
aioobe
1
Cette question et réponse me rappelle encore que même après l'expérience, je devrais me concentrer sur le renforcement de mes bases.
Anand j. Kadhi
13

Object est un supertype de n'importe quelle interface [1]

Cependant, une interface ne implements, extendsou, « Hériter de » Object .

JLS a une clause spéciale pour ajouter des Objectméthodes dans les interfaces [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

irréprochable
la source
C'est la réponse la plus précise. Devrait être celui accepté. Par exemple, une méthode qui prend a java.lang.Objectacceptera également une référence de n'importe quel type d'interface. De plus, vous pouvez convertir une interface en un Objectimplicitement sans aucune erreur du compilateur.
nme le
12

Il y a en fait un champ superclasse dans chaque .classfichier, y compris ceux qui représentent des interfaces.

Pour une interface, il pointe toujours vers java.lang.Object. Mais cela ne sert à rien.

Une autre façon de voir les choses est:

interface MyInterface {
    // ...
}

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

Ici, le cast (Object) paramest toujours valide, ce qui implique que chaque type d'interface est un sous-type de java.lang.Object.

finnw
la source
4
Le fichier .class est un artefact du fichier .java. Expliquer pourquoi quelque chose fonctionne en langage Java en regardant le fichier .class résultant est un raisonnement en arrière.
aioobe
Object obj = (Object) param; ne lance pas d'erreur de compilation. Mais les méthodes (publiques) de MyInterface ne sont pas visibles par obj. Par conséquent, je ne peux pas supposer que MyInterface est que chaque type d'interface est un sous-type de java.lang.Object
sabarinathan u
5

C'est parce employee e = ...que lit qu'il y a une classe qui implémente employee , et est assignée à variable e. Chaque classe qui implémente une interface étend Object implicitement, par conséquent, lorsque vous le faites e.equals(null), le langage sait que vous avez une classe qui est un sous-type de employee.

La JVM effectuera une vérification à l'exécution de votre code (c'est-à-dire lancer NullPointerException).

Buhake Sindi
la source
3

Si l'interface hérite de la classe Object, comment pouvons-nous accéder aux méthodes de la classe objet via une référence de type d'interface?
Aucune interface n'hérite de la Objectclasse, mais elle fournit l'accessibilité à toutes les méthodes de la Objectclasse. Les membres d'une interface sont:

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

déclare une méthode membre abstraite publique correspondant à chaque méthode d'instance publique déclarée dans la Objectclasse .
Il est une erreur de compilation si l'interface déclare explicitement une telle méthode m dans le cas où m est déclarée finalen Object.

Il est maintenant clair que toutes les super-interfaces ont une abstractméthode membre correspondant à chaque publicméthode d'instance déclarée dans Object.

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

Sheo
la source
0

Toute classe implémentant une interface en est également dérivée Objectpar définition.

jabal
la source
0

" Les types de référence héritent tous de java.lang.Object . Les classes, énumérations, tableaux et interfaces sont tous des types de référence. "

Extrait de: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Deuxième phrase pour être claire.

dalvarezmartinez1
la source
Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: il ne dit pas que l'interface hérite de Object. Uniquement les classes, énumérations et tableaux.
Numéro945
Ils l'ont changé :)
dalvarezmartinez1
Même si "ils l'ont changé" (ce dont je doute), le tutoriel peut se tromper. La référence normative est la spécification du langage Java (JLS).
Lew Bloch