Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Instanciar objetos, diversas dúvidas

Dei início a um projeto, usando os conhecimento até o momento adquiridos.

Nesse projeto, criei 6 classes. As classes são as seguintes: Pessoa, Modalidade etc.

Na classe Pessoa, criei um atributo com o tipo Modalidade.

Classe Pessoa.java

import java.util.Date;

public class Pessoa {

    private String matricula;
    private String nome;
    private String cpf;
    private String rg;
    private String funcao;
    private Date dataNascimento;
    private String celular;
    private String emailParticular;
    private String emailComercial;        
    private Modalidade modalidade;
    private Prova prova;
    private Sexo sexo;

    // metodos gets e sets omitidos

    public Modalidade getModalidade() {
        return modalidade;
    }

    public void setModalidade(Modalidade modalidade) {
        this.modalidade = modalidade;
    }

}

Classe Modalidade.java

public class Modalidade {

    private String modalidade;    

    public String getModalidade() {
        return modalidade;
    }

    public void setModalidade(String modalidade) {
        this.modalidade = modalidade;
    }

}

Na classe de teste que é a App.java, instanciei dois objetos de Pessoa.

public class App {
    public static void main(String[] args) {

        Pessoa pessoa = new Pessoa();        
        pessoa.setNome("Rogerio Rodrigues");

        Pessoa pessoa2 = new Pessoa();        
        pessoa2.setNome("Daniel");

        Modalidade modalidade = new Modalidade();
        modalidade.setModalidade("Atletismo");

        System.out.println("Nome: " + pessoa.getNome());        
        System.out.println("Vai jogar na modalidade: " + modalidade.getModalidade());

        System.out.println("Nome: " + pessoa2.getNome());        
        System.out.println("Vai jogar na modalidade: " + modalidade.getModalidade());
    }
}

Minhas dúvidas são as seguintes:

  1. O primeiro objeto pessoa que criei, eu consigo setar um nome para esse objeto e depois posso imprimir o nome. Sabendo que uma pessoa pode jogar uma modalidade, criei um novo objeto de Modalidade e setei a modalidade. Desejo saber como é que a modalidade "Atletismo" é do objeto "pessoa"?

  2. Instanciei um segundo objeto "pessoa2", desejo saber como setar uma modalidade para o objeto "pessoa2"?

5 respostas

Conseguir entender com base no exemplo.

Mas porque para dizer que a pessoa que vai participar de uma modalidade tenho que fazer isso o trecho abaixo

public class App {
    public static void main(String[] args) {

        Pessoa pessoa = new Pessoa();        
        pessoa.setNome("Rogerio Rodrigues");

        pessoa.setModalidade(new Modalidade());
        pessoa.getModalidade().setNome("Atletismo");

        System.out.println("Atleta: " + pessoa.getNome());        
        System.out.println("Vai jogar na modalidade: " + pessoa.getModalidade().getNome());

    }

Para setar uma modalidade a uma pessoa, porque tem que no setModalidade, dentro do parâmetro dá um NEW da Modalidade e depois tem que dá um getModalidade e depois um setModalidade?

Veja só que loucura, a gente vai testando as coisas e vai aparecendo mais dúvidas.

Tenho a classe Pessoa, Modalidade e Prova.

Uma pessoa pode está na competição de atletismo e participar da prova de revezamento.

Então minhas classes estão assim:

Pessoa.java

public class Pessoa {

    private String matricula;
    private String nome;
    private String cpf;
    private String rg;
    private String funcao;
    private Date dataNascimento;
    private String celular;
    private String emailParticular;
    private String emailComercial;        
    private Modalidade modalidade;
    private Prova prova;
    private Sexo sexo;

    // metodos gets e sets omitidos

    public Modalidade getModalidade() {
        return modalidade;
    }

    public void setModalidade(Modalidade modalidade) {
        this.modalidade = modalidade;
    }

}

Modalida.java

public class Modalidade {

    private String nome;
    private Apcef apcef;

    public String getNome() {
        return nome;
    }

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

    public Apcef getApcef() {
        return apcef;
    }

    public void setApcef(Apcef apcef) {
        this.apcef = apcef;
    }

}

Prova.java

public class Prova {

    private String nome;
    private Modalidade nomeModalidade;
    private Sexo sexoModalidade;

    public String getNome() {
        return nome;
    }

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

    public Modalidade getNomeModalidade() {
        return nomeModalidade;
    }

    public void setNomeModalidade(Modalidade nomeModalidade) {
        this.nomeModalidade = nomeModalidade;
    }

    public Sexo getSexoModalidade() {
        return sexoModalidade;
    }

    public void setSexoModalidade(Sexo sexoModalidade) {
        this.sexoModalidade = sexoModalidade;
    }

}

Na minha classe main ficou assim

public class App {
    public static void main(String[] args) {

        Pessoa pessoa = new Pessoa();        
        pessoa.setNome("Rogerio Rodrigues");

        pessoa.setApcef(new Apcef());
        pessoa.getApcef().setNome("Apcef/DF");

        pessoa.setModalidade(new Modalidade());
        pessoa.getModalidade().setNome("Atletismo");

        pessoa.setSexo(new Sexo());
        pessoa.getSexo().setSexo('M');

        pessoa.setProva(new Prova());
        pessoa.getProva().setNome("Corrida 100 metros");

        // Modalidade que esta associada a Prova
        pessoa.getProva().setNomeModalidade(new Modalidade());
        pessoa.getProva().getNomeModalidade().setNome("Revezamento");

        System.out.println("Atleta: " + pessoa.getNome());
        System.out.println("Lotado na: " + pessoa.getApcef().getNome());
        System.out.println("Vai jogar na modalidade: " + pessoa.getModalidade().getNome());
        System.out.println("Sexo: " + pessoa.getSexo().getSexo());
        System.out.println("Vai particpar da prova: " + pessoa.getProva().getNome());
        System.out.println("Modalidade da prova: " + pessoa.getProva().getNomeModalidade().getNome());

    }
}

Sempre que crio um novo objeto e esse objeto precisa informar que Modalidade ou Prova faz parte, tem que fazer como na linha abaixo

pessoa.setModalidade(new Modalidade());
pessoa.getModalidade().setNome("Atletismo");

A parte que me deixou mais confuso foi a seguinte

pessoa.getProva().setNomeModalidade(new Modalidade());
        pessoa.getProva().getNomeModalidade().setNome("Revezamento");

Para informar a prova que um atleta vai participar, descobrir por acaso que, para isso deveria fazer assim pessoa.getProva().setNomeModalidade(new Modalidade());

Eu não entendi ainda porque tenho que fazer assim.

Rogério, beleza?

Se você olhar com calma a sua classe Prova, tem um atributo do tipo Modalidade que você nomeou como nomeModalidade, por esse motivo você precisa passar ele como argumento para o método setNomeModalidade. Cuidado que neste caso da sua classe Prova, este método setter que vive criou graças ao nome da variável do tipo Modalidade ser nomeModalidade, faz você achar que quando chama o método setNomeModalidade, você estaria colocando o nome da modalidade, porém na realidade você está instanciando a modalidade para ai depois conseguir colocar o nome dela.

Ficou confuso mesmo KKKKKKKKK sugiro que você renomeie sua variável e talvez ajude a visualizar mais fácil.

Espero ter ajudado. Bons estudos.

Rafa, tudo bem?

Como eu disse, um atleta (PESSOA) pode está em uma competição (MODALIDADE) e participar de uma prova (PROVA).

Para informar para a PESSOA que ela vai participar de uma PROVA é preciso que saiba qual é a MODALIDADE da PROVA. Sendo que na PROVA tem a composição de MODALIDADE. Entendeu?

Quando no meu teste fui setar o valor da prova, fiz o seguinte:

pessoa.setProva(new Prova());
pessoa.getProva().setNome("Corrida 100 metros");

Para o meu entendimento, quando você instancia um objeto (PESSOA) que já tem uma composição nela de uma prova, não precisaria dá um new Prova para informar a prova que vai participar.

public class Pessoa {

    private String matricula;
    private String nome;
    private String cpf;
    private String rg;
    private String funcao;
    private Date dataNascimento;
    private String celular;
    private String emailParticular;
    private String emailComercial;
    private Apcef apcef;    
    private Modalidade modalidade;
    private Prova prova;
    private Sexo sexo;

"Para o meu entendimento, quando você instancia um objeto (PESSOA) que já tem uma composição nela de uma prova, não precisaria dá um new Prova para informar a prova que vai participar."

Então, vou levar em conta esta parte do que você escreveu.

Eu vi que você fez a composição certinho. Mas se você observar dentro da sua classe Pessoa, você criou o seguinte trecho:

private Prova prova;

E está certo, mas você dentro da sua classe Pessoa, em nenhum momento deu new Pessoa, você apenas criou uma variável do Tipo Pessoa, mas você não instanciou, por isso você está precisando instanciar quando chama seu método, olhei novamente o que você enviou nas outras mensagens e não vi o seu método pois deve estar omitido, porém acredito que deva estar assim:

public void setProva(Prova prova)
{
    this.prova = prova;
}

Você está no caminho certo, a questão é a seguinte, seu método exige uma instancia de Prova, e você está passando por parâmetro, uma outra perspectiva seria a seguinte:

Prova provaA = new Prova();
provaA.setNome("Corrida 100 metros");

Pessoa pessoaA = new Pessoa();
pessoaA.setProva(provaA);

Rogério, espero ter ajudado de alguma maneira. Nunca fui de interagir em fóruns, estou começando aqui na Alura não manjo de formatar legal a resposta e tornar mais intuitiva =)