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

Dúvida no Ex. 6 da Aula 4 - Arrays

Fiz o preenchimento dos salários através de um enlace for, agora só consigo chamar o contem apenas dentro do enlace. Se eu chamar este método fora do enlace é exibida a seguinte mensagem de erro:

funcionario.java:76: error: cannot find symbol empresa.contem(f); ^ symbol: variable f location: class TestaEmpresa 1 error

Há alguma forma de eu apontar a posição que gostaria de testar se é verdadeiro ou falso? Estou colocando meu código abaixo:

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

void mostra(){ //System.out.println("nome: " + this.nome); System.out.println("salario: " + this.salario); //System.out.println("data de entrada: " + this.dataDeEntrada.dataCompleta()); //System.out.println("RG: " + this.RG); }

void recebeAumento(double aumento){ double novoSalario = this.salario + aumento; this.salario = novoSalario; }

void calculaGanhoAnual(double multiplica){ double salAnual = this.salario * multiplica; System.out.println("O salario anual e: " + salAnual); }

}

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

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

void mostraEmpregados (){ for (int i =0 ; i < this.empregados.length; i++){ System.out.print("Funcionário:" + i + " "); System.out.println("O salario e R$" + this.empregados[i].salario); } }

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

boolean contem (Funcionario f){ for (int i = 0; i < this.empregados.length; i++){ if (f == this.empregados[i]){ System.out.println("Contem!"); return true; } } System.out.println("nao Contem!"); return false; }

}

class TestaEmpresa {

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

for (int i = 0; i <= 9; i++) { Funcionario f = new Funcionario (); f.salario = 1000 + i 100; empresa.adiciona(f); //empresa.contem(f); / AQUI FUNCIONA / } empresa.contem(f); / AQUI DÁ ERRO */ } }

6 respostas

Oi Leandro.

Esse erro acontece, devido ao escopo da variável f. Perceba que f está sendo criada dentro do laço for, e portanto, ela só estará disponível até o fim do laço.

Perceba que por isso, quando você chama o método contém passando f dentro do laço, funciona. Quando você chama logo abaixo, depois que o laço terminou, não funciona mais, pois f já não está mais disponível.

Existe uma forma de verificar se o array possui um determinado funcionario, porém não me vem nenhuma solução a mente, sem que precise realizar algumas modificações no seu código, e exigem um pouco mais de conhecimento da linguagem.

Talvez você queira esperar um pouco mais, e isso vai se tornar mais claro para você...

O que acha? Faz sentido?

Tudo bem! Eu fiz a seguinte modificação no meu código pra entender como os métodos adiciona e contem funcionavam:

Funcionario f1 = new Funcionario (); f1.salario = 1000 + 0 * 100; empresa.adiciona(f1); empresa.contem(f1);

Funcionario f2 = new Funcionario (); f2.salario = 1000 + 1 * 100; empresa.adiciona(f2); empresa.contem(f2);

Com isso conseguir entender que o que é enviado pro array é o objeto Funcionário ( f1 e f2 neste caso). Quando estava utilizando o for utilizava sempre a mesma referencia (f), mudando apenas a posição dentro do array. De qualquer forma, obrigado!

Leandro, tudo bem?

Lembre-se que as variáveis não guardam o objeto, mas apenas um endereço, uma referencia para o objeto.

O que é guardado dentro do array, na verdade é uma referencia pra o objeto Funcionario que está na memória.

Dentro do for, você tinha f apontando pra um objeto, e quando você insere f no array, você copia o endereço que f armazena para o array. Neste momento, o indice do array, e f, possuem o mesmo endereço, e apontam para o mesmo objeto.

Quando o laço começa outra iteraçao, somente o indice do array, que tinha sido inserido antes, tem essa referencia, e f agora é criada novamente e quando criamos o objeto com new ..., uma nova referencia é atribuída a f novamente.

No fim, você tem um array, que possui um conjunto de referencias para objetos do tipo Funcionario na memória, mas não o objeto em si.

Qualquer coisa dá uma olhada nessa sessão: https://www.alura.com.br/course/java-1/section/3/explanation, que aqui é explicado essa questão das referências.

Desculpe, se acabei confundindo com a resposta anterior.

E agora? Faz sentido?

Acho que entendi. Quando estava utilizando o for, estava criando 10 referencias f (com o mesmo nome). No segundo caso utilize duas referencias f1 e f2.

Toda vez que dou um new, crio um objeto na memória, como neste caso estou utilizando array, o new cria um objeto no array que por sua vez já "reservou" seu espaço na memória.

Correto?

Isso mesmo Leandro!

E mesmo assim o que vai pro array não é o objetos. O array também armazena apenas referências. Cada compartimento(indice) do array tem uma referencia pra os objetos.

Abraço.

solução!

Entendi, obrigado pelo esclarecimento!