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

Erro com atributo de acesso privado

Meu Código não compila por conta do seguinte erro:

error: empregados has private access in Empresa empresa.empregados = new Funcionario[10]; ^ 1 error

Segue código do arquivo Funcionario.java:

public class Funcionario{
        //Atributos de Funcionario
        //Métodos de Funcionario
}

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

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

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

    public String getCnpj() {
        return this.cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

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

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

    public void mostraEmpregados() {
        for (int i = 0; i < this.livre; i++) {
        System.out.println("Funcionário na posição: " + i);
        System.out.println("R$" + this.empregados[i].getSalario());
        }
    }

    public void mostraTodasAsInformacoes() {
        for (int i = 0; i < this.livre; i++) {
            System.out.println("Funcionário na posição: " + i);
            this.empregados[i].mostra();
        }
    }

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


class Data {
    //Atributos de Data
    //Métodos de Data
}


class TestaFuncionario {
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario();
        f1.setNome("Hugo");
        f1.setDepartamento("TI");
        f1.setSalario(100);
        f1.recebeAumento(50);
        f1.setRg("123456789");
        Data d = new Data();
        d.preencheData(1, 7, 2015);
        f1.setDataEntrada(d);
        f1.mostra();    
    }
}


class TestaEmpresa {
    public static void main (String[] args) {
        Empresa empresa = new Empresa();
        empresa.empregados = new Funcionario[10];

        Funcionario f1 = new Funcionario();
        f1.setNome("Daniel");
        f1.setRg("111111111");
        f1.setDepartamento("Tecnologia da Informação");
        f1.setSalario(10000);
        Data d1 = new Data();
        d1.preencheData(3, 10, 1991);
        f1.setDataEntrada(d1);
        empresa.setFuncionario(f1);

        Funcionario f2 = new Funcionario();
        f2.setNome("André");
        f2.setRg("999999999");
        f2.setDepartamento("Portaria");
        f2.setSalario(1700);
        Data d2 = new Data();
        d2.preencheData(1, 4, 1989);
        f2.setDataEntrada(d2);
        empresa.setFuncionario(f2);

        empresa.mostraTodasAsInformacoes();
    }
}

==================================================================

O QUE ESTÁ ERRADO NO CÓDIGO ACIMA PARA QUE O REFERIDO ERRO APAREÇA?

4 respostas

Oi Daniel,

O problema está na sua classe TestaEmpresa, na segunda linha do metodo main:

empresa.empregados = new Funcionario[10];

Você não pode acessar o atributo empregados da classe Empresa, porque ele é private. O acesso precisa ser via método set para atibuir o array:

empresa.setEmpregados(new Funcionario[10]);

Bons estudos!

Olá Rodrigo,

Alterei o meu código de:

empresa.empregados = new Funcionario[10];

para:

empresa.setFuncionario(new Funcionario[10]);

Quando essa alteração foi compilada, apareceu o seguinte erro:

error: incompatible types: Funcionario[] cannot be converted to Funcionario empresa.setFuncionario(new Funcionario[10]);

Eu entendo que como coloquei o atributo como private na classe Empresa:

private Funcionario[] empregados;

vou ter que acessá-lo por meio de getters e setters desse atributo, mas devo estar errando na implementação desses métodos ou na chamada deles. Até criei anteriormente o método getFuncionario:

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

e também o método setFuncionario:

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

vi que você instruiu a acessar o atributo da seguinte maneira:

empresa.setEmpregados(new Funcionario[10]);

e para isso, eu precisaria ter o método setEmpregados, mas como eu implementaria o mesmo? Você poderia me ajudar nesta dúvida?

solução!

Oi Daniel,

Na verdade o ideal é que o método setEmpregado seja apenas para atribuir o array de funcionarios na classe Empresa. Ou seja, ele não vai adicionar um funcionario na empresa, vai apenas criar o array.

E para adicionar um funcionário na empresa, voce pode criar um outro metodo que teria esse objetivo.

Por exemplo:

public class Empresa {
    private Funcionario[] empregados;
    // outros atributos da classe...

    public Funcionario[] getEmpregados() {
        return this.empregados;
    }

    public void setEmpregados(Funcionario[] empregados) {
        this.empregados = empregados;
    }

    public void adicionaEmpregrado(Empregado empregado) {
        this.empregados[this.livre] = empregado;
        this.livre++;
    }

    //outros metodos...

Repare que o set apenas cria o array e o get devolve o array. E tambem criei um novo metodo chamado adicionaEmpregrado, que sera responsavel por adicionar um novo empregado no array.

Daí para utilizar no main:

class TestaEmpresa {
    public static void main (String[] args) {
        Empresa empresa = new Empresa();

        //Cria um array com 10 posicoes para guardar os funcionario da empresa:
        empresa.setEmpregados(new Funcionario[10]);

        Funcionario f1 = new Funcionario();
        f1.setNome("Daniel");
        f1.setRg("111111111");
        f1.setDepartamento("Tecnologia da Informação");
        f1.setSalario(10000);
        Data d1 = new Data();
        d1.preencheData(3, 10, 1991);
        f1.setDataEntrada(d1);

        //adiciona o f1 na empresa:
        empresa.adicionaFuncionario(f1);

        Funcionario f2 = new Funcionario();
        f2.setNome("André");
        f2.setRg("999999999");
        f2.setDepartamento("Portaria");
        f2.setSalario(1700);
        Data d2 = new Data();
        d2.preencheData(1, 4, 1989);
        f2.setDataEntrada(d2);

        //adiciona o f2 na empresa:
        empresa.adicionaFuncionario(f2);

        empresa.mostraTodasAsInformacoes();
    }
}

Obrigado Rodrigo, esclareceu minha dúvida perfeitamente. Bons estudos e sucesso para você!