Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!