Lista telefônica em ArrayList

Boa noite, pessoal.

Este é o meu primeiro tópico no fórum, portanto, caso eu tenha cometido algum erro de formatação ou infração de regras, por favor, queiram me desculpar xD

Estou de férias da faculdade, e nesse meio período em que estou de bobeira em casa, resolvi estudar Java, devido à minha universidade ser voltada à computação.

Me recomendaram em criar uma lista telefônica, no qual é informado o código, o nome e o número do telefone, utilizando um arraylist, para guardar os dados.

Apenas para a realização de testes, meu programinha está ficando assim:

public class Pessoa {

    private Integer cod;
    private String nome;
    private int fone;

    public Pessoa() {
    }

    public Pessoa(int cod, String nome, int fone) {
        this.cod = cod;
        this.nome = nome;
        this.fone = fone;
    }

    public Integer getCod() {
        return cod;
    }

    public void setCod(Integer cod) {
        this.cod = cod;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getFone() {
        return fone;
    }

    public void setFone(int fone) {
        this.fone = fone;
    }
}

public class Agenda extends Pessoa {

    public Agenda(Integer cod, String nome, int fone) {
        super(cod, nome, fone);
    }
}
import javax.swing.JOptionPane;
import java.util.ArrayList;

public class TestaAgenda {

    public static void main(String args[]) {

        ArrayList agenda = new ArrayList();
        Pessoa p = new Agenda(1, "Ramon", 35331645);
        Pessoa p2 = new Agenda(2, "Teste", 99454545);

        agenda.add(p);
        agenda.add(p2);

        JOptionPane.showMessageDialog(null, agenda.isEmpty()); /*retorna que EXISTEM dados na lista*/
        JOptionPane.showMessageDialog(null, agenda); /*creio que deveria exibir os atributos dos objetos "P" e "P2", correto?*/
    }
}

Ao compilar o código acima, o mesmo retorna um valor estranho, como “[Agenda@46184f97, Agenda@66116674]” no meu NetBeans, por exemplo.

Nesse caso, é o NetBeans que tá loco ou a minha lógica está completamente errada?

Isso é normal.

Quando você instancia um objeto, ele recebe um identificador único e, por padrão, é isto que é exibido quando você converte o objeto para String. Você pode fornecer uma representação diferente para o objeto, sobrescrevendo o método toString da classe que deseja. Por exemplo:


public class Pessoa {

   //todo teu codigo...

   @Override
   public String toString() {
      return "Pessoa(cod=" + cod + ",nome=" + nome + ",fone=" + fone + ")";
   }
}

Isso imprimiria algo como:

Pessoa(cod=1,nome=Wagner,fone=12345679)

Em relação ao seu código, uma dica: não faz sentido algum Agenda extender Pessoa! O que você quer, acredito eu, é que uma Agenda tenha Pessoas e não seja uma Pessoa.

o q o wagner francisco disse faz sentido, tenta deixar assim:

public class Agenda {
    private List<Pessoa> pessoas;

    public List<Pessoa> getPessoas() {
        return pessoas;
    }

    public void setPessoas(List<Funcionario> pessoas) {
        this.pessoas = pessoas;
    }
}  

ai vc mai mexendo com uma lista de Pessoa no seu código, e da o setPessoas depois

pra exibir a informação, outra alternativa é a seguinte:

for (int i=0; i<agenda.getPessoas().size(); i++) {
        JOptionPane.showMessageDialog(null, "Código: "+agenda.getPessoas.get(i).getCod()+
                "Nome: "agenda.getPessoas.get(i).getNome()+
                " Telefone: "+agenda.getPessoas.get(i).getNome());
    }

assim acho q fica mais facil de entender, vc ta colocando uma lista de Pessoa dentro da sua Agenda

Não sei qual o seu conhecimento de OO, mas se tiver um bom conhecimento ja vai uma dica.

cuidado com os métodos getters e setters, pois eles podem quebrar o encapsulamento.

Eu acho uma solução muito melhor fazer assim:[code]public class Agenda{

private List<Pessoa> contatos;

public void adicionarContato(Pessoa contato){
    contatos.add(contato);
}

public void removerContato(Pessoa contato){
    contatos.remove(contato);
}

}[/code] E outros métodos que implementem a sua lógica, fazendo sua classe Agenda um pouco mais “inteligente”.

Segue um post bem interessante e explicativo sobre encapsulamento: