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

Como criar um novo objeto, cuja array é "private" de outra classe?

Olá, testou no exercício 4 do capitulo Modificadores de acesso, estou com a seguinte duvida, como eu crio um objeto cujo a array é "private" em outra classe?

Segue o exemplo da Array do tipo Funcionario1[] funcionarios que foi sugerido deixa-la como private, porem quando eu tento criar um novo objeto do tipo Funcionario1 na classe de teste não consigo devido a restrições de acesso. segue abaixo o codigo completo:

class Funcionario1{

        private String nome;
        private String departamento;
        private double salario;
        Data dataDeEntrada;
        String rg;
        Empresa empresa;


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

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

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

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

        public String getDepartamento(){
            return this.departamento;
        }

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

        public void setDepartamento(String departamento){
            this.departamento = departamento;
        }


        public double setSalario(double novoSalario){
             return this.salario = novoSalario;
        }

        public void mostra(){

                System.out.println("Empresa        : "+this.empresa.nomeDaEmpresa);
                System.out.println("Funcionario    : "+this.nome);
                System.out.println("Deparatamento  : "+this.departamento);
                System.out.println("Salario        : R$ "+this.getSalario());
                System.out.println("Data de Entrada: "+this.dataDeEntrada.mostraData());
                System.out.println("RG             : "+this.rg);
                System.out.println("Ganho Anual    : R$ "+this.getGanhoAnual());
                System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        }

}

class Empresa {

    String nomeDaEmpresa;
    String cnpj;
    String telefone;
    private Funcionario1[] funcionarios;
    int livre = 0;

    public void setFuncionarios (Funcionario1 f){
        this.funcionarios[this.livre] = f;
        this.livre++;

    }

    public Funcionario1 getFuncionarios(int posicao){
        return this.funcionarios[posicao];
    }



    void mostraFuncionarios(){

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

    }

    void mostraTodasAsInformacoes(){
        for(int i=0;i<this.livre;i++){

            this.funcionarios[i].mostra();
        }
    }

    boolean contem(Funcionario1 fx){
        for (int i = 0; i < this.livre; i++){
            if (this.funcionarios[i].getNome() == fx.getNome()){
            return true;    
            }

        }
        return false;

    }

}

class Data {

    int dia;
    int mes;
    int ano;

    void prencheData (int d, int m, int a){
        this.dia = d;
        this.mes = m;
        this.ano = a;

    }

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

}


class TestaFuncionario {

    public static void main(String[] args) {


        Empresa empresa = new Empresa();
        Funcionario1 f1 = new Funcionario1 ();
        Funcionario1 f2 = new Funcionario1 ();

        empresa.funcionarios = new Funcionario1[10];

        empresa.nomeDaEmpresa = "Stefanine";
        empresa.cnpj = "109.000.000/000-98";
        empresa.telefone = "09738725-009988";

        empresa.funcionarios[0] = new Funcionario1();
        empresa.funcionarios[1] = new Funcionario1();

        f1.empresa = empresa;
        f1.setNome("Hugo");
        f1.setDepartamento("Vendas");
        f1.dataDeEntrada = new Data();
        f1.dataDeEntrada.prencheData(01,10,2016);
        f1.rg = "22.000.99-00";
        f1.setSalario(100);
        f1.recebeAumento(50);
        empresa.setFuncionarios(f1);
        empresa.funcionarios[0] = f1;

        f2.empresa = empresa;
        f2.setNome("Jose");
        f2.setDepartamento("Estagio");
        f2.dataDeEntrada = new Data();
        f2.dataDeEntrada.prencheData(01,02,2017);
        f2.rg = "00.000.99-00";
        f2.setSalario(2000.0);
        f2.recebeAumento(1800);
        empresa.setFuncionarios(f2);
        empresa.funcionarios[1] = f2;

        //empresa.setFuncionarios[0].mostra();
        //empresa.setFuncionarios[1].mostra();

        //empresa.mostraFuncionarios();

        empresa.mostraTodasAsInformacoes();

        //empresa.contem(f1);


    }
}

Do jeito que esta basta retirar a restição de acesso "private" do funcionário que testa normal.

6 respostas

Olá José, tudo bem?

Isso ocorre porque quando colocamos:

private Funcionario1[] funcionarios;

Limitamos seu acesso somente a classe Empresas e a classe TesteFuncionario não teria acesso a esse atributo.

Precisamos dessa forma criar métodos públicos para poder manipular esse atributo, esses métodos são os getters e setters.

Dessa forma, tente alterar sua classe TestaFuncionario para utilizar o método setFuncionarios para inserir os funcionários. Segue exemplo do código:

public class TestaFuncionario {

    public static void main(String[] args) {
        Empresa empresa = new Empresa();
        Funcionario1 f1 = new Funcionario1 ();
        Funcionario1 f2 = new Funcionario1 ();

      empresa.setFuncionarios(new Funcionario1[10]);

        empresa.nomeDaEmpresa = "Stefanine";
        empresa.cnpj = "109.000.000/000-98";
        empresa.telefone = "09738725-009988";

        empresa.getFuncionarios()[0] = new Funcionario1();
        empresa.getFuncionarios()[1] = new Funcionario1();

        f1.empresa = empresa;
        f1.setNome("Hugo");
        f1.setDepartamento("Vendas");
        f1.dataDeEntrada = new Data();
        f1.dataDeEntrada.prencheData(01,10,2016);
        f1.rg = "22.000.99-00";
        f1.setSalario(100);
        f1.recebeAumento(50);
        empresa.setFuncionarios(f1);
        empresa.getFuncionarios()[0] = f1;

        f2.empresa = empresa;
        f2.setNome("Jose");
        f2.setDepartamento("Estagio");
        f2.dataDeEntrada = new Data();
        f2.dataDeEntrada.prencheData(01,02,2017);
        f2.rg = "00.000.99-00";
        f2.setSalario(2000.0);
        f2.recebeAumento(1800);
        empresa.setFuncionarios(f2);
        empresa.getFuncionarios()[1] = f2;

        //empresa.setFuncionarios[0].mostra();
        //empresa.setFuncionarios[1].mostra();

        //empresa.mostraFuncionarios();

        empresa.mostraTodasAsInformacoes();

        //empresa.contem(f1);

    }

Espero que dê certo!

Abs

Boa tarde Rafael, ainda não consegui copilar, tenho ainda os seguintes erros no console:

C:\Users\José Carlos\Documents\Java>javac Funcionario1.java
Funcionario1.java:137: error: incompatible types: Funcionario1[] cannot be converted to Funcionario1
                empresa.setFuncionarios(new Funcionario1[10]);
                                        ^
Funcionario1.java:143: error: method getFuncionarios in class Empresa cannot be applied to given types;
                empresa.getFuncionarios()[0] = new Funcionario1();
                       ^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
Funcionario1.java:144: error: method getFuncionarios in class Empresa cannot be applied to given types;
                empresa.getFuncionarios()[1] = new Funcionario1();
                       ^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
Funcionario1.java:155: error: method getFuncionarios in class Empresa cannot be applied to given types;
                empresa.getFuncionarios()[0] = f1;
                       ^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
Funcionario1.java:166: error: method getFuncionarios in class Empresa cannot be applied to given types;
                empresa.getFuncionarios()[1] = f2;
                       ^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
5 errors
solução!

Olá José, tudo bem?

Desculpe, falha minha, ao ler o código a primeira vez achei que o método setFuncionarios estava recebendo um Array. Segue código:

class Funcionario1{

        private String nome;
        private String departamento;
        private double salario;
        Data dataDeEntrada;
        String rg;
        Empresa empresa;


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

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

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

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

        public String getDepartamento(){
            return this.departamento;
        }

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

        public void setDepartamento(String departamento){
            this.departamento = departamento;
        }


        public double setSalario(double novoSalario){
             return this.salario = novoSalario;
        }

        public void mostra(){

                System.out.println("Empresa        : "+this.empresa.nomeDaEmpresa);
                System.out.println("Funcionario    : "+this.nome);
                System.out.println("Deparatamento  : "+this.departamento);
                System.out.println("Salario        : R$ "+this.getSalario());
                System.out.println("Data de Entrada: "+this.dataDeEntrada.mostraData());
                System.out.println("RG             : "+this.rg);
                System.out.println("Ganho Anual    : R$ "+this.getGanhoAnual());
                System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        }

}

class Empresa {

    String nomeDaEmpresa;
    String cnpj;
    String telefone;
    private Funcionario1[] funcionarios=new Funcionario1[10];
    int livre = 0;

    public void setFuncionarios (Funcionario1 f){
        this.funcionarios[this.livre] = f;
        this.livre++;

    }

    public Funcionario1 getFuncionarios(int posicao){
        return this.funcionarios[posicao];
    }



    void mostraFuncionarios(){

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

    }

    void mostraTodasAsInformacoes(){
        for(int i=0;i<this.livre;i++){

            this.funcionarios[i].mostra();
        }
    }

    boolean contem(Funcionario1 fx){
        for (int i = 0; i < this.livre; i++){
            if (this.funcionarios[i].getNome() == fx.getNome()){
            return true;    
            }

        }
        return false;

    }

}

class Data {

    int dia;
    int mes;
    int ano;

    void prencheData (int d, int m, int a){
        this.dia = d;
        this.mes = m;
        this.ano = a;

    }

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

}


class TestaFuncionario {

    public static void main(String[] args) {


        Empresa empresa = new Empresa();
        Funcionario1 f1 = new Funcionario1 ();
        Funcionario1 f2 = new Funcionario1 ();

        empresa.nomeDaEmpresa = "Stefanine";
        empresa.cnpj = "109.000.000/000-98";
        empresa.telefone = "09738725-009988";


        f1.empresa = empresa;
        f1.setNome("Hugo");
        f1.setDepartamento("Vendas");
        f1.dataDeEntrada = new Data();
        f1.dataDeEntrada.prencheData(01,10,2016);
        f1.rg = "22.000.99-00";
        f1.setSalario(100);
        f1.recebeAumento(50);
        empresa.setFuncionarios(f1);

        f2.empresa = empresa;
        f2.setNome("Jose");
        f2.setDepartamento("Estagio");
        f2.dataDeEntrada = new Data();
        f2.dataDeEntrada.prencheData(01,02,2017);
        f2.rg = "00.000.99-00";
        f2.setSalario(2000.0);
        f2.recebeAumento(1800);
        empresa.setFuncionarios(f2);

        empresa.mostraTodasAsInformacoes();

    }
}

Abs

Obrigado Rafael, neste caso o conflito foi apenas por com da array "private" ter sido criada fora da classe? Funcionou blz!

Olá José,

Na verdade o problema em si era que a classe Empresa não possui o Array de funcionários instanciado, uma vez que na classe TestaFuncionario estávamos passando o objeto funcionário para esse Array ocorria um NullPointer Exception, porque não havia a instância do Array Funcionários para poder adicionar o objeto, seria o trecho abaixo:

 private Funcionario1[] funcionarios=new Funcionario1[10];

O uso do private seria um conceito muito importante de orientação a objetos, o encapsulamento. Isto é, os atributos como regra geral não devem ser acessados diretamente por outras classes. Por exemplo, imagine que temos uma classe Conta com o atributo saldo, se nós não protegermos o acesso a esse atributo, nós poderíamos alterar seu conteúdo. Dessa forma, eu preciso "forçar" que caso alguma outra classe instancie o objeto do tipo Conta, essa classe tenha que passar por um método para que assim possa acessar o saldo, nesse método eu posso por exemplo permitir somente que a outra classe veja o saldo getSaldo(), esse métodos vinculados aos atributos são chamados de getters e setters e ajudam nessa tarefa de manter o encapsulamento.

Com o private eu permito que o atributo em questão seja manipulado diretamente somente pela a classe que ele pertence que no caso seria a classe Conta.

Espero ter ajudado!

Abs

Ajudou muito! Obrigado mais uma vez!