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

Trazer informação do Array

Boa tarde amigos,

Estou com uma dúvida.

No exercício 4, o método getFuncionario é exemplificado da seguinte forma:

class Empresa {
    // ...

    public Funcionario getFuncionario (int posicao) {
        return this.empregados[posicao];
    }
}

Eu até consegui reproduzir as informações através do meu código abaixo:

package Exercícios;

class Empresa{
   private String nome;
   int cnpj;
   public Funcionario[] funcionarios;
   private int livre = 0;

     public Funcionario getFuncionario(int posicao){
        return this.funcionarios[posicao];
    }

    public String getNome(int posicao){
        return this.funcionarios[posicao].getNome();
    }

     public double getSalario(int posicao){
        return this.funcionarios[posicao].getSalario();
    }

    public void imprimeFuncionarios(){
          for(int i = 0; i < 10; i++){
            Funcionario funcionario = this.funcionarios[i];
            if(funcionario == null) continue;
            System.out.println(this.funcionarios[i].nome);
        }
    }

    public void mostraEmpregados(){
            for(int b = 0; b < this.funcionarios.length; b++){
            System.out.println(this.funcionarios[b].nome);
            }
        }

    public void adiciona(Funcionario f) {
           this.funcionarios[livre] = f;
           livre++;
       }

    public void mostraPosicaoLivre(){
            for(int c = 0; c < this.livre; c ++){
            System.out.println(this.livre);

            }
    }

    public boolean contem(Funcionario f){
           for(int i = 0; i < this.livre; i++){
            if( this.funcionarios[i] == f){
              return true;             
            }
           }
        return false;
        }

}

class Data{
    int dia;
    int mes;
    int ano;

        public void preencherData(int dia, int mes, int ano){
            this.dia = dia;
            this.mes = mes;
            this.ano = ano;
        }   

        //@Override
        //public String toString(){
        //   return dia + "/" + mes + "/" + ano;

        String getFormatada() {
        return this.dia + "/" + this.mes + "/" + this.ano;

        }
}

class Funcionario{
    private String nome;
    private String departamento;
    private double salario;
    private int RG;    
    private Data dataDeEntrada;

    public double getSalario(){
        return this.salario;
    }

    public void setSalario(int s){
        this.salario = s;
    }

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

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

    public void recebeAumento(double valor){
        this.salario += valor;
    }

    public double calculaGanhoAnual(){
        return this.salario * 12;
    }    

    public void mostra(){
        System.out.println("Nome: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("Salario: " + this.salario);
        System.out.println("Data de Entrada: " + this.dataDeEntrada.getFormatada());
        System.out.println("RG: " + this.RG);
        System.out.println("Ganho Anual: " + this.calculaGanhoAnual());
     }

}

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

        Empresa empresa = new Empresa();
        empresa.funcionarios = new Funcionario[10];  

        // Cria 10 funcionarios no array empresa.funcionarios
        for(int i = 0; i < empresa.funcionarios.length; i++){
            empresa.funcionarios[i] = new Funcionario();
        }       

        empresa.funcionarios[0].setNome("Vitor");
        empresa.funcionarios[0].setSalario(1000);


        // Invoca o método getNome (Mostra todos os nomes dos funcionarios dentro do Array)
        for(int i = 0; i < empresa.funcionarios.length; i++){
            if(empresa.getNome(i) == null)continue;
            System.out.println(empresa.getNome(i));
        }      

        // Invoca o método getSalario (Mostra os salarios de todos os funcionarios do Array)
        for(int i = 0; i < empresa.funcionarios.length; i++){
            if(empresa.getNome(i) == null)continue;
            System.out.println(empresa.getFuncionario(i));
        }     

    }
}

Só que trazendo os Funcionarios pelo método getFuncionario(), eu tenho o seguinte resultado:

run: Exercícios.Funcionario@15db9742 CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

E trazendo pelo metodo getNome(), aparece o nome do Funcionario Vitor, e pelo getSalario(), aparece o salario 1000.

A minha dúvida é a seguinte:

Quando eu chamo um Funcionario do Array, na posição 0 por exemplo, é uma informação um pouco vaga certo ? Por isso ocorre esta mensagem "Exercícios.Funcionario@15db9742". Eu tenho que especificar qual o atributo que eu quero ver do Funcionario, certo ?

Att Vitor

2 respostas
solução!

Vitor,

O array de funcionario armazena objetos do tipo "Funcionarios". Sempre quando tenta exibir um objeto, o método toString( ) da classe é chamado. (Esse método vem da classe Object da qual todas outras herdam por padrão.)

Sendo assim, quando você usa o código:

System.out.println(empresa.getFuncionario(i));

Você está invocando o método toString() do Objeto Funcionário, que por padrão imprime o seu HashCode, que são esses símbolos que você viu.

Para mudar isso, você pode sobrescrever o método, por exemplo:

Na classe Funcionário, criar esse novo método:

@Override
public String toString() { 
    return "Funcionário: '" + this.nome ;
}

Desse modo, ao utilizar o System.out.Println, o método toString será invocado automaticamente imprimindo o nome do funcionário.

Luis obrigado pelo esclarecimento.

Na minha opinião seria legal trocar o exemplo do exercício 4 então. Visto que para nós que estamos aprendendo, invocando o metodo getFuncionario, retornando o HashCode, podemos achar que é erro. O exemplo poderia trazer o nome do funcionário talvez, desta forma teríamos um resultado mais coerente.

Em vez de ser assim:

class Empresa {
    // ...

    public Funcionario getFuncionario (int posicao) {
        return this.empregados[posicao];
    }
}

Poderia ser assim:

class Empresa {
    // ...

    public Funcionario getFuncionario (int posicao) {
        return this.empregados[posicao].nome;
    }
}