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

Dúvida no Ex. 6 da Aula 5 - Modificadores de acesso

Não entendi como se cria o set da Array. Tornei minha Array private, mas agora não consigo acessar ela.

Por favor alguém me mostra o código da class main.

Obrigado

5 respostas

Leonardo, não cria o setter da Array, pois se você criar um setter para Array, cada vez que você chamar o método setter, ele irá criar uma Array nova. Você tem que criar um método para atribuir a referencia a um funcionário a uma das posições de sua array .

A minha classe que contem os métodos e etc ficou assim:

class Empresa {

    private Funcionario[] funcionario;
    private String cnpj;
    private int livre = 0;

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

    public void mostraEmpregados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println(this.funcionario[i].getNome());
        }

    }

    public void mostraTodasInformacoes(){
        for(int i = 0; i < this.livre; i++){
            this.funcionario[i].mostra();
            System.out.println();
        }

    }

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

Ops.. mandei a Classe incompleta sem querer

Segue a Classe completa:

class Empresa {

    private Funcionario[] funcionario;
    private String cnpj;
    private int livre = 0;

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

    public void mostraEmpregados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println(this.funcionario[i].getNome());
        }

    }

    public void mostraTodasInformacoes(){
        for(int i = 0; i < this.livre; i++){
            this.funcionario[i].mostra();
            System.out.println();
        }

    }

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

    public Funcionario getFuncionario(int posicao){
        return funcionario[posicao];

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

Mas e no main ?

Para abrir uma nova Class empresa e uma nova array eu vou fazer isso,

public static void main (String[] args){ Empresa imago = new Empresa(); imago.getFuncionario(10);

Correto ? Com o "imago.getFuncionario(10);" eu estou invocando o método "getFuncionario" e abrindo uma nova array, blz, mas é para criar funcionários novos e armazena eles na array ?

Obrigado pela ajuda.

solução!

Não Leonardo. Vamos la. Vou tentar te explicar.

Primeiramente vou colocar minha classe Empresa aqui.

class Empresa {

    private Funcionario[] funcionario;
    private String cnpj;
    private int livre = 0;

    Empresa(String cnpj){
        this.cnpj = cnpj;
        this.funcionario = new Funcionario[10];
    }

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

    public void mostraEmpregados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println(this.funcionario[i].getNome());
        }

    }

    public void mostraTodasInformacoes(){
        for(int i = 0; i < this.livre; i++){
            this.funcionario[i].mostra();
            System.out.println();
        }

    }

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

    public Funcionario getFuncionario(int posicao){
        return funcionario[posicao];

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

Vamos analisar a classe Empresa. De acordo com minha classe empresa, toda empresa terá como atributo uma Array de Funcionarios, no entanto, essa array ainda não esta criada. Então através do construtor da classe Empresa, eu coloquei a construção da array, criando uma de 11 posições (Começa no 0 e vai ate o 10 ). Ou seja, toda vez que eu criar uma nova empresa está terá uma Array que poderá adicionar 11 funcionários.

Caso você não queira colocar a criação da array no construtor, outra opção seria por a array já como atributo, da seguinte forma:

private Funcionario[] funcionario = new Funcionario[10];

Agora como adicionar um funcionário a minha array? Através de um setter de funcionario na classe Empresa?

Não, caso adicionemos um Setter para o atributo funcionario na classe empresa, este setter irá adicionar uma nova array na sua classe empresa e não um funcionário, que é o que queremos. Então eu criei o método adiciona na classe Empresa, para adicionar um funcionário a minha empresa, colocando ele em uma das posições da minha Array criada pelo construtor.

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

perceba que o método possui um parâmetro, um funcionario, então ele adiciona o funcionário à posição indicada pela variável livre (como livre quando criamos uma classe vale 0 então ele será adicionado na posição 0 da minha array), logo depois, a variavel é incrementada para que o próximo funcionario seja adicionado na posição seguinte.

Vamos testar?

Criei uma classe TestaEmpresa com o método main para testar:

public class TestaEmpresa {
    public static void main(String[] args) {
        Empresa emp = new Empresa();
        Funcionario f1 = new Funcionario();
        f1.setNome("Caio");
        f1.setDepartamento("Desenvolvimento");
        f1.setRg("123456");
        f1.setDataDeEntrada(15, 10, 2000);
        emp.adiciona(f1);

        emp.mostraEmpregados();
    }
}

Veja que eu primeiramente Instanciei a Classe Empresa para criar uma Empresa onde eu atribui o endereço dessa empresa a uma variável emp do tipo Empresa:

        Empresa emp = new Empresa("456789");

Perceba que ao criar a minha empresa eu passei o argumento cnpj, pois no meu construtor eu coloquei o cnpj como parametro, logo para criar a empresa é obrigatório eu passar o cnpj dela. Veja que eu não precisei criar a array pois ela já foi criada a partir do momento que eu criei uma empresa pelo construtor.

Depois, eu criei um funcionario e através dos setters preenchi seus atributos:

        Funcionario f1 = new Funcionario();
        f1.setNome("Caio");
        f1.setDepartamento("Desenvolvimento");
        f1.setRg("123456");
        f1.setDataDeEntrada(15, 10, 2000);

Depois eu utilizei o método adiciona para adicionar o meu funcionario a empresa:

        emp.adiciona(f1);

Por ultimo eu utilizei um método que eu criei na classe empresa, que mostra todos os empregados da empresa, para testar se o empregado Caio foi adicionado.

        emp.mostraEmpregados();

Este método esta na minha classe Empresa e me mostra os nomes dos funcionários da empresa. O método percorre a Array somente onde possui funcionários, através de um for, e imprime o nome destes. Segue o código do método abaixo:

    public void mostraEmpregados(){
        for(int i = 0; i < this.livre; i++){
            System.out.println(this.funcionario[i].getNome());
        }

    }

Qualquer dúvida ainda, só perguntar. Bons estudos!

Perfeito. Muito obrigado, eu estava me confundindo e tentando criar a array no Main, sendo que ela já tinha sido criada na class empresa.

Muito obrigado pela ajuda.