[RESOLVIDO]Instanciação de objetos com o nome da interface
9 respostas
Ar0n
Bem já tenho essa dúvida há algum tempo, as vezes vejo objetos sendo instanciados usando-se o nome da interface para ficar mais claro segui o exemplo:
NomeDaInterface Indentificador = new ClasseQueImplementaInterface;
Qual a diferença para:
ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface;
Particularmente estou habituado a usar a segunda forma ai gostaria de entender quais são as diferenças que o objeto pode sobre por ser instanciado destas formas diferentes?
Editado: Eu já estudei interfaces vejam os exemplos apresentados acima ao inves de simplesmente postarem um link falando que muitas vezes não vai exclarecer minha dúvida.
Uma interface define um padrão que as classes vão seguir (métodos, atributos).
Funciona da mesma forma que uma classe abstrata, não pode ser instanciada pois não é considerada uma classe, e sim um “esqueleto”…
Um bom exemplo é uma interface Pessoa, que possui por exemplo, nome e identificação. Essa classe não pode representar uma pessoa/entidade, mas já as classes que a implementam (PessoaFisica, PessoaJuridica) sim.
Valeu!
T
Tiago_Telles
Quando você usa o nome da interface para o tipo da variável você não fica preso a uma implementação da
daquela interface podendo passar qualquer objeto que à implemente.
E
elizeldepaula
Polimorfismo, polimorfismo e polimorfismo :p
Permite que você passe como parâmetro qualquer objeto que implemente a interface.
por exemplo:
public interface HabitoDePessoas {
public void comer();
public void dormir();
}
publicclassAdultoimplementsHabitoDePessoas{publicvoidcomer(){System.out.println("Adulto come Comida");}publicvoiddormir(){System.out.println("Adulto dorme na cama");}publicvoidandar(){}}
publicclassRecemNascidoimplementsHabitoDePessoas{publicvoidcomer(){System.out.println("Recem Nascido bebe leite");}publicvoiddormir(){System.out.println("Recem nascido dorme em berço");}publicvoidchorar(){}}
publicclassTeste{publicstaticvoidmain(String[]args){HabitoDePessoasadulto=newAdulto();HabitoDePessoasrecemNascido=newRecemNascido();Teste1t=newTeste1();t.testar(adulto);t.testar(recemNascido);}publicvoidtestar(HabitoDePessoasp){// Observe que por implementarem a interface pessoa tanto Adulto como recem nascido podem ser passado como parametros.p.comer();//diferente de se eu colocasse Adulto ou RecemNascido como parametros pois apenas objetos da classe e suas subclasses poderiam p.dormir();//ser passados como parametro./** Obs: nessa variavel você só poderá usar os metodos definidos na interface. Não poderá usar, por exemplo p.andar () ou p.chorar. ( A menos que você faça uma conversão do tipo da variavel, mas acho isso problematico em metodos que usam mais de um tipo de variavel). */}}
publicclassTeste{publicstaticvoidmain(String[]args){Adultoadulto=newAdulto();// A seguinte forma também é valida.RecemNascidorecemNascido=newRecemNascido();Teste1t=newTeste1();t.testar(adulto);t.testar(recemNascido);}publicvoidtestar(HabitoDePessoasp){p.comer();p.dormir();}}
Bom, é isso aí amigo. Tenta dar uma olhadinha nos conceitos de orientação a objetos ( principalmente polimorfismo ) para entender melhor.
Ar0n
Acho que não fui suficientemente claro em minha explicação então farei um exemplo mais prático:
List lista = new ArrayList<>();
Notem que no exemplo acima na hora de instanciar o objeto eu usei a interface List que eh implementada pela classe ArrayList e so em seguida q eu usei a classe que implementa esta interface.
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Agora o segundo exemplo
ArrayList lista = new ArrayList<>();
Agora eu usei somente a clase a classe sem necesssidade da interface (forma na qual estou habituado a usar).
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Ai vem minha dúvida se o objeto pode sofrer alguma diferença por ser instanciado dessas duas formas ou básicamente da no mesmo?
E
elizeldepaula
Acho que não fui suficientemente claro em minha explicação então farei um exemplo mais prático:
List lista = new ArrayList<>();
Notem que no exemplo acima na hora de instanciar o objeto eu usei a interface List que eh implementada pela classe ArrayList e so em seguida q eu usei a classe que implementa esta interface.
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Agora o segundo exemplo
ArrayList lista = new ArrayList<>();
Agora eu usei somente a clase a classe sem necesssidade da interface (forma na qual estou habituado a me deparar).
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Ai vem minha dúvida se o objeto pode sofrer alguma diferença por ser instanciado dessas duas formas ou básicamente da no mesmo?
no primeiro caso List lista = new ArrayList ();
você poderá usar apenas o que foi definido na interface List, ou seja não poderá utilizar o que é exclusivo da classe ArrayList.
No segundo caso ArrayList lista = new ArrayList();
você poderá usar tudo o que foi definido na classe ArrayList();
entretanto no primeiro caso você poderá passar o objeto lista em qualquer coisa que utilize uma variavel do tipo List.
E
elizeldepaula
vou tentar ser mais claro, uma interface é como um contrato e a classe que assina(implementa) essa interface é obrigada a cumprir com os termos do contrato (implementar o que foi definido na interface) . Dessa forma quando eu uso a seguinte sintaxe NomeDaInterface variavel = new NomeDaClasse(); eu garanto que o que esta sendo instanciado implementa a interface em questão, portanto é garantido que ela implementa o que a o contrato em questão (com a interface) o obriga a implementar. Dessa forma numa situação onde um objeto List é esperado eu poderia passar um objeto do tipo ArrayList. Entretanto eu nao posso utilizar recursos ( através dessa variavel do tipo List) que a interface list não defina, pois existe garantia apenas de que o objeto em questão sabe fazer pelo menos o que esta na interface.
Ar0n
elizeldepaula:
Acho que não fui suficientemente claro em minha explicação então farei um exemplo mais prático:
List lista = new ArrayList<>();
Notem que no exemplo acima na hora de instanciar o objeto eu usei a interface List que eh implementada pela classe ArrayList e so em seguida q eu usei a classe que implementa esta interface.
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Agora o segundo exemplo
ArrayList lista = new ArrayList<>();
Agora eu usei somente a clase a classe sem necesssidade da interface (forma na qual estou habituado a me deparar).
(ClasseQueImplementaInterface Indentificador = new ClasseQueImplementaInterface; )
Ai vem minha dúvida se o objeto pode sofrer alguma diferença por ser instanciado dessas duas formas ou básicamente da no mesmo?
no primeiro caso List lista = new ArrayList ();
você poderá usar apenas o que foi definido na interface List, ou seja não poderá utilizar o que é exclusivo da classe ArrayList.
No segundo caso ArrayList lista = new ArrayList();
você poderá usar tudo o que foi definido na classe ArrayList();
entretanto no primeiro caso você poderá passar o objeto lista em qualquer coisa que utilize uma variavel do tipo List.
Vlw elizeldepaula e obrigado a resposta de todos!
E
elizeldepaula
Gostaria de fazer uma pequena retificação da seguinte frase
Na verdade independente de você fazer List lista = new ArrayList() ou ArrayList lista = new ArrayList(), você ainda poderá passar um arraylist como argumento em qualquer lugar que espere receber um “List”
Ar0n
elizeldepaula:
Gostaria de fazer uma pequena retificação da seguinte frase
Na verdade independente de você fazer List lista = new ArrayList() ou ArrayList lista = new ArrayList(), você ainda poderá passar um arraylist como argumento em qualquer lugar que espere receber um “List”