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

Herança e composição de objeto

Olá pessoal! Me ajudem em uma questão por favor. Estou testando herança e composição de objeto, e fiz as seguintes classes: Pessoa, Funcionário e Endereço todas com seus métodos get e set. A classe endereço compõe a classe pessoa, pois toda pessoa "tem" um endereço, e a classe funcionário herdou as características da classe pessoa, pois todo funcionário "é" uma pessoa. Instanciei o objeto funcionário, usei os métodos para inserir o endereço para um funcionário, e na hora que tento imprimir no console, apresenta a seguinte mensagem:

" Exception in thread "main" java.lang.NullPointerException at TestaFuncionario.main(TestaFuncionario.java:8)"

Vocês poderiam me informar aonde que eu estou errando?


public class Pessoa {

    private String nome;
    private String cpf;
    private int dataNascimento;
    private Endereco endereco;

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

    }

    public String getNome() {
        return this.nome;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getCpf() {
        return this.cpf;
    }

    public void setDataNascimento(int dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public int getDataNascimento() {
        return this.dataNascimento;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Endereco getEndereco() {
        return this.endereco;
    }

}

public class Funcionario extends Pessoa {

    private double salario;
    private double bonificacao;




}

public class Endereco {

    private String endereco;
    private int numero;
    private String cep;
    private String estado;

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getEndereco() {
        return this.endereco;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public int getNumero() {
        return this.numero;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getCep() {
        return this.cep;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getEstado() {
        return this.estado;
    }

}

public class TestaFuncionario {

    public static void main(String[] args) {

        Funcionario funcionario = new Funcionario();

        funcionario.getEndereco().setEndereco("Rua ABC");
        System.out.println(funcionario.getEndereco().getEndereco());




    }
}
4 respostas

Oi Leonardo, tudo bem?

Você estava no caminho certo. Irei te explicar por partes onde você errou. Segue abaixo:

Classe pessoa.java

private Endereco endereco;

public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Endereco getEndereco() {
        return this.endereco;
    }

Na classe pessoa, você cria um atributo do tipo private para simular a composição, pois pessoa tem um endereço. A ideia da composição está certa, mas a implementação está errada. Na classe endereço, você já tem os métodos get e set endereço, certo ? Então, você poderia apenas ter instanciado o tipo Endereco dentro da classe pessoa, excluindo assim os métodos getEndereco e setEndereco dentro da mesma. Ficando desta forma:

 Endereco endereco = new Endereco();

Quanto a classe Funcionario e Endereco, tudo certo.

Já na classe TestaFuncionario, para executar o código, poderia ter feito da seguinte maneira:

    Funcionario funcionario = new Funcionario();
    funcionario.endereco.setEndereco("Rua ABC");
    System.out.println(funcionario.endereco.getEndereco());

Ou seja, criamos uma nova instância da classe funcionário e a partir dela, conseguimos acessar a instância de endereço.

Deixo abaixo o código:

Pessoa.java

public class Pessoa {

    private String nome;
    private String cpf;
    private int dataNascimento;
    Endereco endereco = new Endereco();

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

    }

    public String getNome() {
        return this.nome;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getCpf() {
        return this.cpf;
    }

    public void setDataNascimento(int dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public int getDataNascimento() {
        return this.dataNascimento;
    }

}
TestaFuncionario.java

public class TestaFuncionario {
  public static void main(String[] args) {
    Funcionario funcionario = new Funcionario();
    funcionario.endereco.setEndereco("Rua ABC");
    System.out.println(funcionario.endereco.getEndereco());
  }
}

Qualquer dúvida estou a disposição. Espero ter ajudado. Bons estudos!!!

Olá Nádia, muito obrigado pela a explicação, mas me tirar mais uma dúvida por favor. Vi que o atributo endereço da classe pessoas não é privado, nesse caso, é uma boa prática deixa-lo dessa forma?

solução!

Oi Leonardo, observe que quando instanciarmos a classe funcionário e acessar o atributo endereço, dentro da classe endereço todos os atributos são privados, então preenchemos esta lacuna de proteger nossas variáveis(iremos conseguir acessá-los somente via funções getters e setters). Na função principal, observe que utilizamos:

funcionario.endereco.setEndereco("Rua ABC");

Ou seja, diretamente não conseguimos modificar o valor.

Espero que tenha ajudado. Bons estudos!!!

Ah sim, agora ficou claro. Muito obrigado Nádia!