[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.

9 Respostas

Bruno_Cunha

Olá.

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”…

Dê uma lida aqui que tem bem explicadinho.

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

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

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();


}
public class Adulto implements HabitoDePessoas{

   public void comer(){

       System.out.println("Adulto come Comida");
   }
   
   public void dormir (){
      System.out.println("Adulto dorme na cama");
   }

  public void andar(){}
}
public class RecemNascido implements HabitoDePessoas{
    public void comer(){
       System.out.println("Recem Nascido bebe leite");
    }

    public void dormir(){
        System.out.println("Recem nascido dorme em berço");
    }

    public void chorar(){}
}
public class Teste{

   public static void main (String [] args){
       HabitoDePessoas adulto = new Adulto();
       
       HabitoDePessoas recemNascido = new RecemNascido();

        Teste1 t = new Teste1();
         t.testar(adulto);
         t.testar(recemNascido);
      
       
    }
     
   public void testar (HabitoDePessoas p){ // 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).
	*/
   }
 
}
public class Teste{

   public static void main (String [] args){
   Adulto adulto = new Adulto(); // A seguinte forma também é valida.
       
   RecemNascido recemNascido = new RecemNascido();

        Teste1 t = new Teste1();
         t.testar(adulto); 
         t.testar(recemNascido);
		 
      
       
    }
     
   public void testar (HabitoDePessoas p){ 
       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

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

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

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”

blz :thumbup:

Criado 24 de dezembro de 2012
Ultima resposta 24 de dez. de 2012
Respostas 9
Participantes 4