Método sendo executado em uma verificação

Boa tarde pessoal,

Tenho o seguinte código:

[code]public class Empresa {

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();

}

}
[/code]

[code]public class Funcionario {

String nome, departamento, RG, email;
Double salario;
Boolean veioTrabalhar;
Data dtEntrada;


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

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

boolean demite (){
	System.out.println("Funcionário demitido");
	return true;
}

void mostra(){
	System.out.println("Nome: " + this.nome);
	System.out.println("Departamento: " + this.departamento);
	//utiliza o método dataFormat do objeto Data (dtEntrada é do tipo Data)
	System.out.println("Data de entrada: " + this.dtEntrada.dataFormat());
	System.out.println("RG: " + this.RG);
	System.out.println("Email: " + this.email);
	System.out.println("Salário: " + this.salario + "\n");
}

[/code]

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?

Quando você está fazendo f.demite() você está chamando o método.

Como que eu faço a verificação se ele é false então?

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.

Mas ai que está, eu só chamei pra fazer a verificação do valor do método, acredito que essa código não está executando o método. Ou está?

Ele está escrevendo na tela “Funcionário demitido”?

Escreve sim.

Então, pronto. Está executando o método, sim.

Você conhece alguma forma de eu fazer a verificação booleana sem executar o método?

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?

Por que depois, eu vou começar a usar o método demite(), ai o exercício pediu pra eu verificar se ele ainda está lá ou é um ex-funcinário heheh.

Fiz o seguinte:

Na classe funcionário

Boolean demitido;

boolean demite (){ System.out.println("Funcionário demitido"); demitido = true; return true; }

e na classe empresa

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; } }

Deveria funcionar, certo?

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/

Ah sim! A apostila que eu estou utilizando esse assunto não foi abordado, mas valeu o toque, vou ler logo já pra dar um insight.

Obrigado pela ajuda!