String nome, cnpj;
Funcionario[] empregados = new Funcionario[10];
int i;
void adicionar(Funcionario f,int i){
if (this.empregados[i] == null) {
this.empregados[i] = f;
}
}
void mostraArray (){
for (Funcionario x : empregados){
if (x != null){
System.out.println(x.salario);
}
}
}
boolean contem(Funcionario f) {
if (f.demite() == false){
System.out.println("Funcionário ainda da empresa");
return true;
} else {
return false;
}
}
}[/code]
[code]public class TestaEmpresa {
public static void main(String[] args) {
Empresa a = new Empresa ();
Funcionario b = new Funcionario();
b.salario = 2000.0;
a.empregados[2] = b;
for (int i = 0; i < 5; i++) {
Funcionario f = new Funcionario();
f.salario = 1000.0 + i;
a.adicionar(f,i);
a.contem(f);
}
a.mostraArray();
}
Por algum motivo a linha if (f.demite() == false){ que está dentro do método boolean contem(Funcionario f) está executando o método demite() ao invés de fazer apenas a verificação. Já debuguei algumas vezes mas ainda não entendi a razão. Alguém pode me ajudar por favor?
Você está fazendo a verificação. Este método demite() está retornando true. É só você dar uma olhada na implementação dele na classe Funcionário. Você está verificando se o retorno do método é igual a false (no caso isto é falso, já que o método sempre está retornando true)
Mas eu até então entendia que o retorno só será dado caso o método seja utilizado, e até então eu não chamei ele em lugar algum. Sendo assim, o método seria false, que é o default do boolean, certo?
O método está sendo chamado, sim. No main você está chamando o método contém() da classe Empresa, e, dentro deste método, tem uma chamada para o método demite(), da classe Funcionario.
Bom, você poderia ter esse valor em uma variável. Daí comparava o valor da mesma com true ou false. Mas, me metendo um pouco na lógica do programa, para que vc quer saber se o funcionário pertence ou não a empresa? Se você criou este funcionário, ele obviamente pertence a ela, não?
boolean contem(Funcionario f) {
if (f.demitido == false){
System.out.println("Funcionário ainda da empresa");
return true;
} else {
System.out.println("Funcionário não esta empresa");
return false;
}
}
Sim. Mas aí você pode colocar o método demite() como void, já que não é mais necessário pegar o retorno dele.
Uma dica: não pegue o valor de uma variável diretamente por ela, isso não é uma boa prática na orientação a objetos. Construa um método que retorne o valor dessa variável (exemplo: getDemitido()). Mas não é uma regra ter que fazer isso. Leia esse post do blog da caelum pra dar uma esclarecida no assunto: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/