Les interfaces héritent-elles de la classe Object
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 {
}
Les interfaces héritent-elles de la classe
Object
en Java?
Non, ils ne le font pas. Et il n'y a pas non plus d'interface commune "racine" implicitement héritée par toutes les interfaces (comme dans le cas des classes).(*)
Si non, alors comment nous pouvons appeler la méthode de la classe d'objet sur une instance d'interface
Une interface a implicitement déclaré une méthode pour chaque méthode publique dans Object
. Ainsi, la méthode equals
est implicitement déclarée comme membre dans une interface (sauf si elle l'hérite déjà d'une superinterface).
Ceci est expliqué en détail dans le Java Language Specification, § 9.2 Interface Members .
9.2 Membres de l'interface
[...]
- Si une interface n'a pas de superinterfaces directes, alors l'interface déclare implicitement une méthode membre abstraite publique m avec signature s, renvoie le type r, et renvoie la clause t correspondant à chaque méthode d'instance publique m avec la signature s, retourne le type r, et jette la clause t déclarée dans
Object
, sauf si une méthode avec la même signature, même retour et une clause throws compatible est explicitement déclarée par l'interface.[...]
Ce message a été réécrit en tant qu'article ici .
(*) Notez que la notion d'être un sous-type de n'est pas équivalente à 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 classes et d'interfaces ) même s'ils n'héritent pas de Object
.
Il y a en fait un champ de superclasse dans chaque .class
fichier, 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;
// ...
}
Voici le casting (Object) param
est toujours valide, ce qui implique que chaque type d'interface est un sous-type de Java.lang.Object
.
Object
est un super-type de n'importe quelle interface [1]
Cependant, une interface ne implements
, extends
, ou, "hérite de" Object
.
JLS a une clause spéciale pour ajouter des méthodes Object
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
En effet, employee e = ...
Indique qu'il existe une classe implémenteemployee
et est affectée à la variable e
. Chaque classe qui implémente une interface étend Object implicitement, donc quand vous faites e.equals(null)
, le langage sait que vous avez une classe qui est un sous-type de employee
.
La JVM fera la vérification de l'exécution de votre code (c'est-à-dire throw NullPointerException
).
L'interface hérite-t-elle de la classe Object, comment pouvons-nous accéder aux méthodes de la classe Object via une référence de type d'interface
Aucune interface n'hérite de la classe Object
, mais elle fournit l'accessibilité à toutes les méthodes de la classe Object
. 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 classe Object
.
Il s'agit d'une erreur de compilation si l'interface déclare explicitement une telle méthode m dans le cas où m est déclaré final
dans Object
.
Il est maintenant clair que toutes les superinterfaces ont une méthode membre abstract
correspondant à chaque méthode d'instance public
déclarée dans Object
.
source: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
Toute classe implémentant une interface est également dérivée de Object
ainsi par définition.
" Les types de référence héritent tous de Java.lang.Object . Les classes, énumérations, tableaux et interfaces sont tous des références types. "
Cité de: http://docs.Oracle.com/javase/tutorial/reflect/class/index.html Deuxième phrase pour être clair.