[Resolvido] Uso das Interface

Vamos ver se alguem me ajuda a tirar uma duvida…

Se eu tenho a seguinte linha de codigo;

ArrayList pessoa  = new ArrayList();

Isso significa que eu estou criando uma instancia na memoria que guardara’ objetos somente do tipo ArrayList. Certo ou errado?

Se assim for, eu posso descrever essa linha:

List pessoa  = new ArrayList();

da seguinte maneira:

Estou criando uma instancia na memoria que vai guardar uma ArrayList e vou acessa-la atraves da variavel pessoa que é uma List, ou seja, mais generico q o ArrayList.
Como isso funciona, teoricamente a variavel pessoa nao tem os mesmos atributos que ArrayList, mas eu sei q isso funciona.
Alguem pode me explicar?

Valeu

não .-.

ArrayList pessoa = new ArrayList();

tá executando dois códigos:

  1. cria -UM- objeto da classe ArrayList, identificado por pessoa
  2. atribui a este objeto as definições básicas do construtor da classe ArrayList
    ou seja, é equivalente de
ArrayList pessoa;
pessoa = new ArrayList();

o segundo código, creio eu, seja válido (não sei muito de Java), é uma polimorfia das classes herdadas
o que acontece é que ArrayList é filha de List, portanto, um objeto filho pode ser armazenado em um pai, já que tudo que List tem, ArrayList também tem

não entendi muito bem a dúvida, mas não é porque estamos instanciando um objeto da classe ArrayList, que significa que estamos fazendo um vetor de objetos ArrayList

recomendo uma pesquisa sobre herança e polimorfismo de classes :wink:

ArrayList pessoa  = new ArrayList();  

Isso significa que eu estou criando uma instancia na memoria que guardara’ objetos somente do tipo ArrayList. Certo ou errado?

Se assim for, eu posso descrever essa linha:

List pessoa  = new ArrayList();  

errado nesse caso você vai estar armazenando uma lista de Objetos
você poderá armazenar uma pessoa nessa lista pois todos os objetos herdam da classe Object
mas não terá acesso acesso a os métodos de pessoa sem fazer um casting na hora de recuperar os dados da lista

para criar uma lista de um tipo especifico de Objeto use generics

ex:


List<Pessoa> pessoas = new ArrayList<Pessoa>();

dessa forma sua lista ira aceitar somento objetos do tipo pessoa
tendo a cesso a todos os metodos da Classe pessoa sem ter de si preocupar com castings

N pessoal… Ou eu n soube explicar ou eu n entendi oq vcs me explicaram.
Esquece se é pessoa ou n.
Eu ja tentei ler outros artigos mas tem essa duvida q n me deixa dormir. :?:

Vamos fazer assim:

List minhaLista = new ArrayList();

Eu n vou conseguir acessar alguns metodos da ArrayList, por exemplo o removeRange().

minhaLista.removeRange();

Esse codigo nao funciona.
Q sentido tem eu criar um objeto ArrayList se eu n posso acessar os metodos do ArrayList?
So para ganhar polimorfismo?

Espero ter conseguido explicar a minha duvida.

Ninguém? E’… e’ dificil eu sei. :wink:

Da uma lida na primeira pagina desse tópico

http://www.guj.com.br/java/72505-usar-arraylist-colecao :idea:

Nesse caso seu link é esse:

[quote=devaney]N pessoal… Ou eu n soube explicar ou eu n entendi oq vcs me explicaram.
Esquece se é pessoa ou n.
Eu ja tentei ler outros artigos mas tem essa duvida q n me deixa dormir. :?:

Vamos fazer assim:

List minhaLista = new ArrayList();

Eu n vou conseguir acessar alguns metodos da ArrayList, por exemplo o removeRange().

minhaLista.removeRange();

Esse codigo nao funciona.
Q sentido tem eu criar um objeto ArrayList se eu n posso acessar os metodos do ArrayList?
So para ganhar polimorfismo?

Espero ter conseguido explicar a minha duvida.[/quote]

Cara não é difícil… é trabalhoso e é um Processo bastante pessoal… Kda um entende da sua maneira. Eu entendi o acontecimento, depois entendi como usar. Então vamos lá, tomara que eu consiga lhe passar alguma coisa.

Primeiro, List é uma interface. Interfaces definem um contrato específico que toda e qualquer classe que a implementar, deve respeitar esse contrato. Logo quando você faz assim:

public interface Automovel {
    void montar(List<PecaDeAutomovel> pecas);
}

public interface PecaDeAutomovel {
    String localizacaoPeca();
}

Você está dizendo que toda e qualquer classe que quiser ser um automóvel ou uma peça de automóvel, deve no mínimo implementar os métodos montar() de automóvel e localizacaoPeca() de Peça de automóvel.

Aí vamos agora criar uma classe de Peça, afinal vamos começar a montar o nosso automóvel…

public class Volante implements PecaDeAutomovel {
    private String cor;
    private String localizacao;

    public String localizacaoPeca(){
        return localizacao;
    }
    
    // gets e sets
}

public class Carro implements Automovel {
    
    public void montar(List<PecaDeAutomovel> pecas) {
        for(PecaDeAutomovel peca : pecas){
             System.out.println("Colocar peça no carro em " peca.localizacaoPeca());
        }
    }
}

public class Main {
    public static void main(String []args) {
        List<PecaDeAutomovel> pecas = new ArrayList<PecaDeAutomovel>();
        PecaDeAutomovel volante = new Volante();
        pecas.add(volante);
        Automovel carro = new Carro();
        carro.montar(pecas);
    }
}

BOM… não sei se ajudei ou confundi, mas vamos aos pormenores do que ocorreu…

na classe Main, eu criei uma PecaDeAutomovel volante; no lugar de um Volante volante;

sei que não pus outros métodos em Volante além do próprio que já havia na Interface, mas se houvessem os mesmos não poderiam ser acessados pela referência volante, afinal volante embora receba um Objeto Volante (new Volante()) ele é do tipo PecaDeAutomovel e em PecaDeAutomovel só existe o método localizacaoPeca()… “Porque isso Adriano ??? Se for assim eu preferia ter criado um Volante volante = new Volante(); Afinal poderia desfrutar de todos os métodos de Volante”

Mas aí, lá no método montar, você teria que receber Vários parâmetros de tipos diferentes, seu método montar ficaria assim

void montar(Volante volante, List<Pneu> pneus, Marcha marcha, List<Banco> bancos, etc...) {...}

Percebeu o trabalho qu você economizou ??? Ao adicionar uma nova peça, basta você criar ela com o tipo da Interface PecaDeAutomovel e adicionar ela na Lista que o método montar, vai reconhecer sua peça de automóvel automaticamente e você não precisa ir no método montar e adicionar mais uma peça na lista de parâmetros, o que a longo prazo, poderia deixar seu Sistema com a manutenção horrível, pois a cada nova peça você teria que ir em todas as classes que chamam montar e adicionar a nova peça… Enfim… essa é uma das vantagens, torça para alguém com saco pra explicar dizer aqui uma outra vantagem… Espero que possa ajudar nos seus estudos… se não entendeu, grita aí pra eu tantar ser mais claro…

PS: Escreví com pressa e não testei os códigos… Perdoem-me qualquer falha…

Abs[] e bopns estudos…

[quote=ViniGodoy]Nesse caso seu link é esse:

respondi antes de ler o Link… Enfim, a explicação do Viny está bem mais completa… Se não entender agora… Bom, se prepare, afinal o conceito vai demorar pra ser entendido…

Abs []

A uniao dos dois exemplos me ajudaram a entender melhor.
No meu caso eu n conseguia ver vantagem visto que eu nao posso usar os metodos da classe filha, e conclui q cada caso é um caso e se por acaso seje necessario usar os metodos da classe filha eu vou ter que criar um objeto do tipo filho tb.
Acho que conseguirei fixar isso, somente com alguns projetos e exercios.

Valeu pessoal