Método sendo executado em uma verificação

15 respostas
andrepm

Boa tarde pessoal,

Tenho o seguinte código:

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

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

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?

15 Respostas

E

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

andrepm

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

E

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)

andrepm

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?

E

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.

andrepm

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á?

E

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

andrepm

Escreve sim.

E

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

andrepm

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

E

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?

andrepm

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.

andrepm

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?

E

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/

andrepm

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!

Criado 13 de março de 2014
Ultima resposta 17 de mar. de 2014
Respostas 15
Participantes 2