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

Sobre ArrayList

quando eu faco um ArrayList de objetos e coloco um comando poara imprimir dessa forma:

ArrayList<Cliente> clientes = new ArrayList<>();
        clientes.add(cliente1);
        cliente1.imprimeCliente();

usar o ArrayList nao faz a minima diferenca, eu poderia simplesmente dar um

cliente1.imprimeCliente();

que o resultado seria o mesmo! qual a vantagem de utilizar ArrayList nesse caso?

11 respostas

Boa tarde, Leonardo! Como vai?

Nesse caso específico onde vc só quer imprimir o cliente1 realmente não há vantagem nenhuma de utilizar um ArrayList. A vantagem só irá surgir caso vc tenha um conjunto de clientes (digamos uns 100) e queira armazenar eles na lista para depois imprimir cada um deles! Aí vc pode fazer algo do tipo:

List<Cliente> clientes = new ArrayList<>();
// coloca cada um dos clientes na lista

for (Cliente c : clientes) {
     c.imprimeCliente();
}

Caso contrário, se vc quisesse fazer a mesma coisa sem uma lista, teria que ser assim:

cliente1.imprimeCliente();
cliente2.imprimeCliente();
cliente3.imprimeCliente();
// ...
cliente100.imprimeCliente();

Ninguém iria querer fazer um código assim! Mas, a boa notícia é que as listas existem e podemos fazer bom uso delas!

Caso algo não tenha ficado claro é só falar!

Grande abraço e bons estudos!

estou fazendo alguns programas mesmo para aprender e fixar...quando dei um

for (Cliente cliente : clientes) {
            Cliente.imprimeCliente();
        }

ele imprimiu 3, mas todos o mesmo cliente!

Pq provavelmente vc deve ter posto 3 clientes iguais na lista. Cole aqui o restante do seu código para que eu possa dar uma olhada, Leonardo!

package cadastroClientes;

import java.util.ArrayList;

public class TestaCliente {

    public static void main(String[] args) {

        Cliente cliente1 = new Cliente();
        cliente1.setIdade(25);
        cliente1.setNome("Francisco");

        Endereco endereco1 = new Endereco();
        endereco1.setRua("Amadeu Amaral");
        endereco1.setNumero(421);

        Cliente cliente2 = new Cliente();
        cliente2.setIdade(42);
        cliente2.setNome("norberto");

        Endereco endereco2 = new Endereco();
        endereco2.setRua("Visconde de inhauma");
        endereco2.setNumero(1265);

        Cliente cliente3 = new Cliente();
        cliente3.setIdade(31);
        cliente3.setNome("Clodivildo");

        Endereco endereco3 = new Endereco();
        endereco3.setRua("Francisco rosa");
        endereco3.setNumero(251);


        ArrayList <Cliente> clientes = new ArrayList<>();
        clientes.add(cliente1);
        clientes.add(cliente2);
        clientes.add(cliente3);


        for (Cliente cliente : clientes) {
            Cliente.imprimeCliente();
        }






    }

}

Leonardo, vc errou nesse trecho de código:

for (Cliente cliente : clientes) {
     Cliente.imprimeCliente();
}

O correto seria:

for (Cliente cliente : clientes) {
     cliente.imprimeCliente();
}

Repare que cliente foi escrito com c minúsculo pois se trata do nome da variável auxiliar criada no início do for.

Por fim, se esse seu código compilou, é provável que vc tenha criado o método imprimeCliente() como static dentro da classe Cliente. Se eu estiver correto, remova o modificador static do método.

sim estava com static no metodo (foi uma sugestao sugerida pelo eclipse). mas pq tirar o static?

Vou te explicar, mas para que eu possa ter um contexto melhor da situação e te dar uma explicação mais clara, por favor, cole aqui a sua classe Cliente.

package cadastroClientes;

public class Cliente {

    private static String nome;
    private static int idade;
    private Endereco endereco;

    public static String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public static int getIdade() {
        return idade;
    }
    public void setIdade(int idade) {
        this.idade = idade;
    }

    @Override
    public String toString() {

        return this.nome;
    }

    public void imprimeCliente() {
        System.out.println("Cliente: " +getNome()+ "\nIdade: " +getIdade());
    }




}
solução!

Blz, Leonardo! Lá vai a explicação!

Quando vc utiliza o static o que vc está dizendo é que aquele atributo ou método marcado com essa palavra chave será acessado como informação da classe! No caso dos atributos, por exemplo, implica dizer que eles terão o mesmo valor para qualquer objeto que vc crie. Mas não é isso que vc está tentando fazer e, por isso, a utilização do static está incorreta! Tanto é verdade, que quando vc manda imprimir os clientes da lista vc obtém como resposta:

Cliente: Clodivildo
Idade: 31
Cliente: Clodivildo
Idade: 31
Cliente: Clodivildo
Idade: 31

Justamente pq seus atributos nome e idade estão marcados como static, tendo um único valor para todos os objetos que vc criou!

O que vc quer é que cada um dos seus objetos clientes criados tenha seu próprio nome e sua própria idade! Para isso vc deve retirar o static de todos os lugares onde vc o colocou na classe Cliente, e por fim, quando for listar os clientes, deve fazer da forma como mostrei anteriormente (usando cliente com c minúsculo dentro do for):

for (Cliente cliente : clientes) {
     cliente.imprimeCliente();
}

Pegou a ideia?

muito obrigado pela explicacao...ficou muito claro!

Mto bem, Leonardo! Por nada!

Manda bala aí nos estudos então!

Grande abraço!