Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Duvida no método Contains e Equals

Pessoal, uma dúvida sobre a chamada dos métodos Contains e Equals:

Sobreescrevemos o método Equals na classe Conta, e na classe TesteArrayListEquals chamamos o método Contains que internamente faz a chamada do IndexOf e que internamente faz a chamada do Equals, mas quando vou acessando esses métodos, sempre cai no método original

  public boolean equals(Object obj) {
        return (this == obj);
    }

Pq que quando chamo o Contains, vem o método que foi sobreescrito na classe Conta sendo que a classe de teste ou até mesmo a classe ArrayList e Object nao extendem a classe Conta?

Otro ponto, o equals que é chamado por de baixo dos panos no método Contains, é o original, não o que foi refeito.

Alguém sabe dizer?

4 respostas

Olá Bruno, tudo bem com você?

Isso mesmo, quando vamos navegando entre as classes, vamos encontrar esse método equals() na maioria das vezes, é normal. Isso porque o Java monta um template de como os métodos devem funcionar e internamente todos os objetos devem ter o método equals(). Por isso, ao entrar em funções mais complexas e achar um método equals, a documentação vai te direcionar para esse método padrão. No entanto é importante lembrar que o método equals() existe para ser sobrescrito e para que cada classe tenha sua implementação própria: o que faz uma Conta ser igual a outra Conta? Caso não haja a implementação, o Java vai simplesmente comparar as referências e se forem dois objetos diferentes, com exatamente os mesmos valores nos atributos, ele vai considerar duas contas diferentes.

O motivo pelo qual o Java consegue utilizar o equals() corretamente, é pela sobrescrita do método. Lembra daquela anotação @Override? Com ela, sinalizamos para o compilador Java que é um método sobrescrito e quando for utilizado nesta classe, ele que deverá ser chamado, e por isso é utilizado a implementação que fizemos do método equals() para comparar contas.

Portanto, o método equals() que é chamado sempre é o da implementação da classe, e caso ele não seja implementado, aí sim será utilizado o equals() default do Java, que existe justamente para não quebrar todos os códigos e fazer com que métodos, como o contains(), que implementam por debaixo dos panos o método equals() não fiquem jogando exceções para o usuário.

Fico à disposição em caso de dúvidas.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Então sempre que um método tiver a anotação @Override, ele terá prioridade ao invés do método original?

solução!

Perfeito! Quando um método tem a anotação @Override, ele passa a ser utilizado como padrão pela classe que o implementa. É a maneira que o Java tem de entender qual método ele deve utilizar, e por via de regra sempre será o método mais específico da classe: aquele com a assinatura @Override.

Esse comportamento é muito útil com herança e polimorfismo, sendo inclusive muito utilizado para design patterns, como o Strategy.

Fico à disposição.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Entendi, ficou bem claro agora. Muito obrigado pela ajuda!

Abraço!