ArrayList e Classe - Acesso a metodos [Resolvido]

Boa noite,

Criei a classe abaixo:

public class ExercicioClasse {

    private String _nome;
    private String _snome;
    private int _idade;

    public ExercicioClasse(String _nome, String _snome, int _idade)
    {
        this._nome = _nome;
        this._snome = _snome;
        this._idade = _idade;
    }

    /**
     * Contrutor vazio para atender as subclasses
     */
    public ExercicioClasse()
    {

    }

    public void setNome(String _mnome)
    {
        _nome = _mnome;
    }

    public String getNome()
    {
        return _nome;
    }

    public void setSNome(String _msnome)
    {
        _snome = _msnome;
    }

    public String getSNome()
    {
        return _snome;
    }

    public void setIdade(int _midade)
    {
        _idade = _midade;
    }

    public int getIdade()
    {
        return _idade;
    }

    public void mostraMensagem()
    {
        System.out.println("As informações inseridas foram:");
        System.out.println("Nome:      " + getNome());
        System.out.println("Sobrenome: " + getSNome());
        System.out.println("Idade:     " + getIdade());
    }

}

A classe abaixo, herdou as caracteristicas, da postada acima:

public class CadastroDeAmigos extends ExercicioClasse{



    public static void main(String args[])
    {
        /**
         * Primeiro trecho de código, executado, com sucesso.
         *
        ExercicioClasse exc = new ExercicioClasse();
        exc.setNome("X");
        exc.setSNome("Y");
        exc.setIdade(1);
        exc.mostraMensagem();
        */
        List<ExercicioClasse>exc = new ArrayList<ExercicioClasse>();
        exc
    }

}

Na linha 17, começou meu problema, a idéia era chamar cada objeto do ArrayList. Usar cada set da classe pai, para atribuir valores no ArrayList, nas variaveis _nome, _snome e _idade.

Depois imprimir, os valores do ArrayList, através do metodo “mostraMensagem()”.

É possivel usar os sets, herdados, para atribuir os valores. E os gets e o metodo (“mostrarMensagem()”), para exibir as saidas?

[]s

Olá,
você não precisa herdar a classe ExercicioClasse para poder ter acesso aos métodos. Você pode retirar o “extends ExercicioClasse”.

Os objetos ExercicioClasse deverão ser armazenados no ArrayList exc. Para chamar os métodos do objeto armazenado você deverá acessar o índice do ArrayList e aí chamar o método desejado… compreende?

Att.

Meu entendimento sobre seu problema: criar objetos ExercicioClasse, utilizar os métodos set’s para definir nome snome e idade, e dpois chamar o método mostraMensagem() para exibir as informações de cada objeto.

seria isso msm cara :?:

se sim, alterei a classe CadastroDeAmigos, conforme abaixo:

[code]import java.util.ArrayList;

public class CadastroDeAmigos extends ExercicioClasse{

public static void main(String args[]) {

    ArrayList<ExercicioClasse> myList = new ArrayList<ExercicioClasse>();
	
	ExercicioClasse exc = new ExercicioClasse();
    exc.setNome("X");
    exc.setSNome("Y");
    exc.setIdade(1);
    
	ExercicioClasse exc2 = new ExercicioClasse();
    exc2.setNome("X2");
    exc2.setSNome("Y2");
    exc2.setIdade(2);
	
	ExercicioClasse exc3 = new ExercicioClasse();
    exc3.setNome("X3");
    exc3.setSNome("Y3");
    exc3.setIdade(3);
	
	myList.add(exc);	// adiciona a array
	myList.add(exc2);	// adiciona a array
	myList.add(exc3);	// adiciona a array
	
	for (ExercicioClasse e : myList) {
		e.mostraMensagem(); // para cada elemento da array, ele chama o método mostraMensagem();
	}
}

}[/code]

caso não seja isso, seja mais preciso :!:

:smiley:

[/quote]

É o entendi também. Só acho que deve ser tirado o “extends ExercicioClasse”, que não se aplica ao caso. :slight_smile:

Att.

Outra coisa. Procure seguir as convenções de código do Java.

Ou seja, não use _ no início de nomes de variável. Também é bom não ser economico no nome das variáveis. Ao invés de sNome, é melhor chamar a variável de sobrenome.

Bom dia,

Obrigado pela ajuda até o momento :slight_smile:

Vamos lá, ajustei os nomes e refiz a classe que executa o metodo, o código segue abaixo:

public class ExercicioClasse {
    private String nome;
    private String sobrenome;
    private int idade;

    public ExercicioClasse(String nome, String sobrenome, int idade) {
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.idade = idade;
    }

    /**
     * Contrutor vazio para atender as subclasses
     */
    public ExercicioClasse() {

    }

    public void setNome(String x) {
        nome = x;
    }

    public String getNome() {
        return nome;
    }

    public void setSobreNome(String x) {
        sobrenome = x;
    }

    public String getSobreNome() {
        return sobrenome;
    }

    public void setIdade(int x) {
        idade = x;
    }

    public int getIdade() {
        return idade;
    }

    public void mostraMensagem() {
        System.out.println("As informações inseridas foram:");
        System.out.println("Nome:      " + getNome());
        System.out.println("Sobrenome: " + getSobreNome());
        System.out.println("Idade:     " + getIdade());
    }

}
public class CadastroDeAmigos {

    public static void main(String args[]) {
        List<ExercicioClasse>listaexercicioclasse = new ArrayList<ExercicioClasse>();
        
        for (int i = 1; i <= 3; i++) {
            ExercicioClasse itemexercicioclasse = new ExercicioClasse();

            itemexercicioclasse.setNome("X" + i);
            itemexercicioclasse.setSobreNome("Y" + i);
            itemexercicioclasse.setIdade(i);
            
            listaexercicioclasse.add(itemexercicioclasse);
        }
        
        for (ExercicioClasse e: listaexercicioclasse) {
            e.mostraMensagem();
        }

    }
}

Quanto ao código:

Na linha 04, do segundo bloco de códigos, usei “List” no lugar de “ArrayList”, pois estava no exemplo que segui. Está correto?

Quanto a convenção:

A forma que reescrevi, desrespeita alguma conveção?

No primeiro bloco de código, especificamente, é um contrutor “em branco”, é correto mater aquela linha em branco?

[]s

Sim, é a maneira correta de fazer. Esse tópico explica o porque:
http://www.guj.com.br/posts/list/55387.java#290673

Perfeito.

Por que manter um construtor sem parâmetros?
Se os campos são obrigatórios, vc não deveria ter um construtor assim. Se realmente for necessário só para atender as subclasses, torne-o protected.

Deixar ou não aquela linha em branco é opcional. Eu geralmente não deixo. Algumas pessoas chegam a colocar as chaves na mesma linha, mas isso também não é 100% de acordo com a convenção do java.

Uma outra alteração que eu faria. As classes de negócio geralmente não devem realizar tarefas de view (como “mostrar mensagens”).
Nesse caso, transforme o método mostraMensagem() no toString(). E faça a exibição pela view:

[code]public class ExercicioClasse {
private String nome;
private String sobrenome;
private int idade;

public ExercicioClasse(String nome, String sobrenome, int idade) {
    this.nome = nome;
    this.sobrenome = sobrenome;
    this.idade = idade;
}

public void setNome(String x) {
    nome = x;
}

public String getNome() {
    return nome;
}

public void setSobreNome(String x) {
    sobrenome = x;
}

public String getSobreNome() {
    return sobrenome;
}

public void setIdade(int x) {
    idade = x;
}

public int getIdade() {
    return idade;
}

@Override
public String toString() {
    return String.sprinf("Nome: %s %n Sobrenome: %s%n Idade: %d", 
        getNome(), getSobrenome(), getIdade());      
}

}[/code]

E na view:

[code]
public class CadastroDeAmigos {
public static void main(String args[]) {
Listlistaexercicioclasse = new ArrayList();

    for (int i = 1; i <= 3; i++) {
        ExercicioClasse itemexercicioclasse = new ExercicioClasse();

        itemexercicioclasse.setNome("X" + i);
        itemexercicioclasse.setSobreNome("Y" + i);
        itemexercicioclasse.setIdade(i);
        
        listaexercicioclasse.add(itemexercicioclasse);
    }
    System.out.println("As informações inseridas foram:"); 
    for (ExercicioClasse e: listaexercicioclasse) {
        System.out.println(e);
    }

}

}[/code]

Finalmente, seria uma boa renomear sua classe de ExercicioClasse para Amigo. Além disso, não tem porque a classe CadastroDeAmigos fazer aquele extends ali.

Boa noite,

[quote] @Override public String toString() { return String.sprinf("Nome: %s %n Sobrenome: %s%n Idade: %d", getNome(), getSobrenome(), getIdade()); } [/quote]

Desta forma, ela atua, plenamente como um model de saida. E a responsabilidade da execução, fica para, a view. Entendi. :slight_smile:

[quote] System.out.println("As informações inseridas foram:"); for (ExercicioClasse e: listaexercicioclasse) { System.out.println(e); } [/quote]

Nesse bloco ele está executando realmente a view, exibindo, a saida “As informações inseridas foram:” que a principio estavam erronhamente na classe model.

Realmente, não faz sentido, vou ajustar.

Sim, não havia percebido, que era um erro. Até as primeiras respostas, de Adelar e userguj. Na verdade, “vi realmente”, assim que me passaram a forma de acesso e insersão das informações.

Vou fazer essas correções, e postar assim que ajustar.

Só me restou uma duvida, “@Override”, qual é a função?

[]s

Quando você usa o @Override você está avisando o compilador que você está sobrescrevendo um método da classe pai.

Ele não é necessário. Mesmo que vc não escreva, vc ainda vai sobrescrever métodos. Mas, usar a tag faz com que você evite erros de digitação. Se você marcar algo com @Override e não estiver sobrescrevendo nada, o compilador te avisa. Por exemplo, vamos supor que vc cometa o seguinte erro de digitação:

@Override public String tostring() { }

Como toString precisa do S maiúsculo, o compilador diz “O método tostring() não está sobrescrevendo nada”. E então vc vai até lá e corrige. Sem o @Override, o código também compilaria, e vc acabaria com 2 métodos. O toString(), que faz o que vc não quer, e o tostring() que faz o que vc quer, mas não está sobrescrevendo nada.

Note que essa função da tag é especialmente importante quando vc renomeia métodos. Se vc renomear um método da classe pai, que está sendo sobrescrito nas filhas, a tag irá exigir que vc renomeie corretamente em todos os filhos. Sem a tag, corre-se o risco de esquecer de renomear em algum lugar.

Boa tarde,

Fiz as correções:

public class Amigo {
    private String nome;
    private String sobrenome;
    private int idade;

    public Amigo(String nome, String sobrenome, int idade) {
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.idade = idade;
    }

    /**
     * Contrutor vazio para atender as subclasses
     */
    protected Amigo() {
    }

    public void setNome(String x) {
        nome = x;
    }

    public String getNome() {
        return nome;
    }

    public void setSobreNome(String x) {
        sobrenome = x;
    }

    public String getSobreNome() {
        return sobrenome;
    }

    public void setIdade(int x) {
        idade = x;
    }

    public int getIdade() {
        return idade;
    }

    @Override
    public String toString() {
        return String.format("Nome: %s%nSobrenome: %s%nIdade: %d%n",
        getNome(), getSobreNome(), getIdade());
    }
}
public class ListaDeAmigos{

    public static void main(String args[]) {
        List<Amigo>listadeamigos = new ArrayList<Amigo>();
        
        for (int i = 1; i <= 10; i++) {
            Amigo itemexercicioclasse = new Amigo();

            itemexercicioclasse.setNome("X" + i);
            itemexercicioclasse.setSobreNome("Y" + i);
            itemexercicioclasse.setIdade(i);
            
            listadeamigos.add(itemexercicioclasse);
        }
        
        System.out.println("As informações inseridas foram:\n");
        for (Amigo e: listadeamigos) {
            System.out.println(e);
        }
        
    }

Muito obrigado pela ajuda que me deram, vocês acrecentaram, muito conhecimento a mim, neste tópico.

[]s

1 curtida