¿Las interfaces heredan de la clase Object en java?


157

¿Las interfaces heredan de la Objectclase en Java?

Si no, cómo podemos llamar al método de clase de objeto en la instancia de interfaz

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

interface Employee {
}

@EJP, técnicamente hablando, no importa lo que contenga java / io / Serializable.class. Creo que estás confundiendo la Java Lang Spec con la especificación JVM.
aioobe

@aioobe Como no he mencionado ninguna de esas especificaciones, no entiendo tu punto. Serializablees una interfaz, la más simple posible; ejecutarlo javapte dice de qué hereda; y eso lo dicta la especificación del lenguaje Java. Si cree que la especificación JVM entra en algún lugar, por favor, avísenos.
Marqués de Lorne

2
@EJP, la pregunta es sobre el lenguaje Java (es decir, la Especificación del lenguaje Java). Lo que java / io / Serializable.class contiene está relacionado con lo que dice la especificación JVM. Técnicamente hablando no hay garantía de que haya una correspondencia uno a uno entre las características de las dos especificaciones.
aioobe

Lo expliqué en una publicación de blog reciente .
aioobe

Respuestas:


161

¿Las interfaces heredan de la Objectclase en Java?

No, ellos no. Y tampoco hay una interfaz común "raíz" heredada implícitamente por todas las interfaces (como en el caso de las clases). (*)

Si no, cómo podemos llamar al método de clase de objeto en la instancia de interfaz

Una interfaz declaró implícitamente un método para cada método público en Object. Por lo tanto, el equalsmétodo se declara implícitamente como miembro en una interfaz (a menos que ya lo herede de una superinterfaz).

Esto se explica en detalle en la Especificación del lenguaje Java, § 9.2 Miembros de la interfaz .

9.2 Miembros de la interfaz

[...]

  • Si una interfaz no tiene superinterfaces directas, entonces la interfaz declara implícitamente un método de miembro abstracto público m con firma s , tipo de retorno r , y lanza la cláusula t correspondiente a cada método de instancia pública m con firma s , tipo de retorno r , y lanza la cláusula t declarado enObject , a menos que la interfaz declare explícitamente un método con la misma firma, el mismo tipo de retorno y una cláusula throws compatible.

[...]


Esta publicación ha sido reescrita como un artículo aquí .


(*) Tenga en cuenta que la noción de ser un subtipo de no es equivalente a heredar de : Las interfaces sin superinterfaz son, de hecho, subtipos de Object( § 4.10.2. Subtipo entre clases y tipos de interfaz ) aunque no hereden de Object.


1
@aioobe Si implementamos alguna interfaz, ¿por qué no damos la implementación del método "igual" en la clase que implementa esa interfaz? Según mis conceptos, tenemos que implementar los métodos de interfaz en la implementación de la clase; de ​​lo contrario, la clase será abstracta.
Vikas Mangal

1
No necesita (re) implementar métodos heredados. Echa un vistazo a este ejemplo . En otras palabras, equals ya está definido y heredado a la clase que implementa la interfaz.
aioobe

3
Tengo el punto aquí. Pero una pregunta: ¿por qué necesitamos esto? ¿Qué diferencia habría hecho si los métodos de Objectclase no se hubieran declarado en la interfaz?
Vikas Mangal

2
Si no tuviéramos esto, el programa en la pregunta no se compilaría. Hay un equalsmétodo en la Employeeinterfaz.
aioobe

1
Esta pregunta y respuesta aún me recuerdan que, incluso después de la experiencia, debería centrarme en hacer que mis conceptos básicos sean fuertes.
Anand j. Kadhi

13

Object es un supertipo de cualquier interfaz [1]

Sin embargo, una interfaz no lo hace implements, extendso, "Heredar del" Object .

JLS tiene una cláusula especial para agregar Objectmétodos a las 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


Esa es la respuesta más precisa. Debería ser el aceptado. Por ejemplo, un método que toma un java.lang.Objecttambién aceptará una referencia de cualquier tipo de interfaz. Además, puede emitir una interfaz Objectimplícitamente sin ningún error del compilador.
nme

12

En realidad, hay un campo de superclase en cada .classarchivo, incluidos los que representan interfaces.

Para una interfaz a la que siempre apunta java.lang.Object. Pero eso no se usa para nada.

Otra forma de verlo es:

interface MyInterface {
    // ...
}

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

Aquí el reparto (Object) paramsiempre es válido, lo que implica que cada tipo de interfaz es un subtipo de java.lang.Object.


44
El archivo .class es un artefacto del archivo .java. Argumentar por qué algo funciona en lenguaje Java mirando el archivo .class resultante es un razonamiento hacia atrás.
aioobe

Objeto obj = (Objeto) param; no arroja error de compilación. Pero los métodos de MyInterface (public) no son visibles para obj. Por lo tanto, no puedo asumir que MyInterface es que cada tipo de interfaz es un subtipo de java.lang.Object
sabarinathan u

5

Eso es porque employee e = ...lee que hay una clase que implementa employee , y se asigna a la variable e. Cada clase que implementa una interfaz extiende Object implícitamente, por lo tanto, cuando lo haces e.equals(null), el lenguaje sabe que tienes una clase que es un subtipo de employee.

La JVM hará una comprobación de tiempo de ejecución para su código (es decir, throw NullPointerException).


3

Es la interfaz hereda la clase Object, ¿cómo podemos acceder a los métodos de la clase de objeto a través de una referencia de tipo de interfaz?
No Interface no hereda la Objectclase, pero proporciona accesibilidad a todos los métodos de la Objectclase. Los miembros de una interfaz son:

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

declara un método de miembro abstracto público correspondiente a cada método de instancia pública declarado en Objectclase .
Es un error en tiempo de compilación si la interfaz declara explícitamente tal método m en el caso en que se declare que m está finalen Object.

Ahora está claro que todas las superinterfaces tienen un abstractmétodo miembro correspondiente a cada publicmétodo de instancia declarado en Object.

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


0

Cualquier clase que implemente cualquier interfaz también se deriva Objecttambién por definición.


0

" Todos los tipos de referencia heredan de java.lang.Object . Las clases, enumeraciones, matrices e interfaces son todos tipos de referencia " .

Citado de: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Segunda oración para ser clara.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: no dice que la interfaz hereda de Object. Solo clases, enumeraciones y matrices.
Número 945

Lo cambiaron :)
dalvarezmartinez1

Incluso si "lo cambiaron" (lo cual dudo), el tutorial puede estar equivocado. La referencia normativa es la Especificación del lenguaje Java (JLS).
Lew Bloch
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.