As interfaces herdam da classe Object em java


157

As interfaces herdam da Objectclasse em Java?

Se não, como podemos chamar o método da classe de objeto na instância da interface

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

interface Employee {
}

@EJP, tecnicamente falando, não importa o que java / io / Serializable.class contenha. Eu acho que você está confundindo o Java Lang Spec com o JVM.
aioobe

@aioobe Como não mencionei nenhuma dessas especificações, não entendo o seu ponto. Serializableé uma interface, a mais simples possível; correr javapnele diz a você do que herda; e isso é ditado pela Java Language Specification. Se você acha que a JVM Spec entra em algum lugar, por favor, nos esclareça.
Marquês de Lorne

2
@EJP, a pergunta é sobre a linguagem Java (ou seja, a Java Language Specification). O que java / io / Serializable.class contém está relacionado ao que a especificação da JVM diz. Tecnicamente falando, não há garantia de que haja uma correspondência individual entre os recursos das duas especificações.
aioobe

Eu elaborei isso em uma postagem recente no blog .
Aioobe

Respostas:


161

As interfaces herdam da Objectclasse em Java?

Não, eles não. E também não existe uma interface "raiz" comum herdada implicitamente por todas as interfaces (como no caso das classes). (*)

Se não, como podemos chamar o método da classe de objeto na instância da interface

Uma interface declarou implicitamente um método para cada método público em Object. Portanto, o equalsmétodo é implicitamente declarado como membro de uma interface (a menos que já o herda de uma superinterface).

Isso é explicado em detalhes na Especificação da Linguagem Java, § 9.2 Membros da Interface .

9.2 Membros da interface

[...]

  • Se uma interface não possui superinterfaces diretas, a interface declara implicitamente um método de membro público abstrato m com assinatura s , tipo de retorno r , e lança a cláusula t correspondente a cada método de instância pública m com assinatura s , tipo de retorno r e lança a cláusula t declarado emObject , a menos que um método com a mesma assinatura, o mesmo tipo de retorno e uma cláusula throws compatível seja declarado explicitamente pela interface.

[...]


Esta postagem foi reescrita como um artigo aqui .


(*) Observe que a noção de ser um subtipo de não é equivalente a herdar de : Interfaces sem super interface são de fato subtipos de Object( § 4.10.2. Subtipagem entre tipos de classe e interface ), mesmo que não sejam herdados de Object.


1
@aioobe Se implementamos alguma interface, por que não damos a implementação do método "equals" na classe que está implementando essa interface. De acordo com meus conceitos, temos que implementar os métodos de interface na implementação de classe, caso contrário a classe será abstrata.
Vikas Mangal

1
Você não precisa (re) implementar métodos herdados. Dê uma olhada neste exemplo . Em outras palavras, igual já está definido e herdado para a classe que implementa a interface.
precisa saber é

3
Eu entendi o ponto aqui. Mas uma pergunta: por que precisamos disso? Que diferença teria feito se os métodos de Objectclasse não tivessem sido declarados na interface?
Vikas Mangal

2
Se não tivéssemos isso, o programa em questão não seria compilado. Existe um equalsmétodo na Employeeinterface.
aioobe

1
Essa pergunta e resposta ainda me lembram que, mesmo após a experiência, devo me concentrar em fortalecer meus princípios básicos.
Anand j. Kadhi

13

Object é um supertipo de qualquer interface [1]

No entanto, uma interface não faz implements, extendsou, "herdam" Object .

O JLS possui uma cláusula especial para adicionar Objectmétodos às 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


Essa é a resposta mais precisa. Deve ser o aceito. Por exemplo, um método que aceita a java.lang.Objecttambém aceitará uma referência de qualquer tipo de interface. Além disso, você pode converter a interface Objectimplicitamente em nenhum erro do compilador.
nme

12

Na verdade, existe um campo de superclasse em todos os .classarquivos, incluindo aqueles que representam interfaces.

Para uma interface, ela sempre aponta para java.lang.Object. Mas isso não é usado para nada.

Outra maneira de ver isso é:

interface MyInterface {
    // ...
}

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

Aqui o elenco (Object) paramé sempre válida, o que implica que cada tipo de interface é um subtipo de java.lang.Object.


4
O arquivo .class é um artefato do arquivo .java. Argumentar por que algo funciona na linguagem Java observando o arquivo .class resultante é um raciocínio reverso.
precisa saber é o seguinte

Objeto obj = (Objeto) param; não gera erro de compilação. Mas os métodos de MyInterface (public) não são visíveis para obj. Portanto não pode assumir MyInterface é cada tipo de interface é um subtipo de java.lang.Object
sabarinathan u

5

Isso employee e = ...ocorre porque lê que há uma classe que implementa employee e é atribuída à variável e. Toda classe que implementa uma interface estende Object implicitamente, portanto, quando o faz e.equals(null), a linguagem sabe que você tem uma classe que é um subtipo de employee.

A JVM fará a verificação do tempo de execução do seu código (ou seja, throw NullPointerException).


3

Is interface herda Object class, como podemos acessar os métodos da classe Object através de uma referência de tipo de interface
No Interface não herda a Objectclasse, mas fornece acessibilidade a todos os métodos da Objectclasse. Os membros de uma interface são:

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

declara um método público abstrato do membro correspondente a cada método de instância pública declarado na Objectclasse .
É um erro de tempo de compilação se a interface declara explicitamente tal método um m no caso em que m é declarado finalno Object.

Agora está claro que todas as superinterface têm um abstractmétodo membro correspondente a cada publicmétodo de instância declarado em Object.

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


0

Qualquer classe que implemente qualquer interface também é derivada Objecttambém por definição.


0

" Todos os tipos de referência herdam de java.lang.Object . Classes, enumerações, matrizes e interfaces são todos os tipos de referência. "

Citado em: http://docs.oracle.com/javase/tutorial/reflect/class/index.html Segunda frase a ser esclarecida.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: não diz que a interface herda de Object. Somente Classes, enums e matrizes.
945

Eles mudaram :)
dalvarezmartinez1

Mesmo se "eles mudaram" (o que eu duvido), o tutorial pode estar errado. A referência normativa é a Java Language Specification (JLS).
Lew Bloch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.