Dúvida com argumentos

6 respostas
LuanMesquita

Olá pessoal,

sou novo aqui, tenho uma dúvida tosca más não tive vergonha
de perguntar para vocês porque a final, estamos aqui é para aprender não
é?

Então pessoal estou com um dúvida em argumentos, tenho esse seguinte e
simples parte de código.

class ControleDeBonificacoes {

private double totalDeBonificacoes = 0;

public void registra(Funcionario funcionario) {

this.totalDeBonificacoes += funcionario.getBonificacao();

}

}

Minha dúvida está em negrito e é o seguinte, quando eu for
instanciar um objeto dessa classe e usar o método registra
e colocar como argumento por exemplo: funcionario1, estarei criando
um novo objeto chamado funcionario1 do tipo Funcionario? ou irei
atribuir algum valor a algum atributo do objeto funcionario do tipo Funcionario?.

Estou confuso porque se fosse assim public void registra(int $numero) ,
caso eu coloque o valor 10 como argumento o que aconteceria era isso $numero = 10;

Conto com ajuda de vocês,
vlw.

6 Respostas

Francisco_Silva

Pelo o que endendi, sua duvida é se você esta criando um novo objeto quando passa algum valor no argumento do método...
Não, no argumento do método você passa apenas valores e não se cria nenhum novo objeto...

Para entender melhor...
class ControleDeBonificacoes { 

	private double totalDeBonificacoes = 0;

	public void registra(Funcionario funcionario) { //funcionario é uma variável de referencia local do método registra().

	       this.totalDeBonificacoes += funcionario.getBonificacao(); //Aqui você esta chamando o método getBonificacao(), de um objeto do tipo Funcionario que esta sendo referenciado pela variável funcionario.

	} 
}
Em nenhum momento desse código você esta criando um novo objeto... na verdade você só cria um novo objeto quando usa a palavra reservada "new" e em algum outros raros casos fazendo uso de recursos específicos... Um dos caso específicos seria as Strings...

String texto = "texto"; //Recurso especifico, onde não se usa o "new" para criar um objeto, nesse caso o objeto já é criado por padrão.

Funcionario funcionario1 = new Funcionario(); //Aqui sim esta sendo criado um novo objeto do tipo Funcionario e atribuindo sua referencia para a variável funcionario1....
Note a presença da palavra "new", considere-se que esse é o "único" modo de se criar ou instanciar um novo objeto.
registra(funcionario1); //Aqui esta sendo passado o valor de referencia da variável "funcionario1" para a variável local "funcionario" do método registra.
Esse valor seria algo como se fosse um meio para acessar o objeto que esta alocado em algum lugar da memória... sendo assim... tanto a variável "Funcionari1" quanto a variável "funcionario" referenciam ao mesmo objeto, e por conseqüência podem chamar os métodos desse mesmo objeto.
public void registra(int $numero){} // $numero é uma variável local do tipo primitivo int.

registra(10); //Sim você estava passando o valor 10 do tipo inteiro para a variável local $numero... sendo assim "$numero = 10"

Note os dois tipos de variáveis... uma variável de referencia e uma variável de tipos primitivos...

Variável de referencia: armazena uma referencia ao objeto e não o objeto.
Variável de tipo primitivo: essa sim, armazena o valor propriamente dito do tipo primitivo.

De uma olhada nesse topico que fala sobre objetos.
[url]http://www.guj.com.br/posts/list/227147.java#1163794[/url]

adrianoneres

eaí cara, sussa, não precisa ter vergonha não :smiley:

quanto à tua duvida, vou tentar explicar de forma bem simples:

Quando você instanciar o objeto dessa classe e usar o método registra(funcionario), você deve passar um objeto funcionario pra esse método, claro. :stuck_out_tongue:

O funcionário que você passar para o método pode ser um funcionário que já tenha sido criado, por exemplo:

ControleDeBonificacoes cdb = new ControleDeBonificacoes();

Funcionario funcionario1 = new Funcionario();
funcionario1.setBonificacao(500);

cdb.registra(funcionario1);

mas você também pode passar um novo funcionario para o método:

ControleDeBonificacoes cdb = new ControleDeBonificacoes();

cdb.registra(new Funcionario());

Mas você quer saber se você estará criando um novo objeto. Pois é… não. Fazendo o que está sendo mostrado no primeiro exemplo você só estará passando o funcionario1, que já está criado, para o método executar alguma ação. Na assinatura do método, quando você escreve registra(Funcionario funcionario) significa que este método, toda vez que for usado, deve receber um objeto do tipo Funcionario, e dentro do método, esse objeto recebido será trabalhado com o “nome” de funcionario.

No caso do número é a mesma coisa, se você tivesse a seguinte situação:

public void registra(int numero) {
//...
}

e em outra classe executasse esse método, da seguinte forma:

ControleDeBonificacoes cdb = new ControleDeBonificacoes();
cdb.registra(10);

você estaria dizendo que naquele momento, o valor da sua variável numero (que está dentro do método) é 10 - mas somente naquele momento. se num próximo momento você chamar novamente esse método e passar o número 20 como argumento, a sua variável numero terá o valor 20 para aquela execução do método.

No entanto, você não poderia criar o método registra(Funcionario funcionario) e instanciá-lo passando cdb.registra(10) - pois o método esperava um objeto do tipo Funcionario, e recebeu um do tipo primitivo int.

LuanMesquita

Opa pessoal, vlw atenção.

Então vamos lá,

As duas explicações de vocês deixaram bem claro minha dúvida
vamos ver se entendi corretamente.

Tenho os seguintes códigos:

class ControleDeBonificacoes {

private double totalDeBonificacoes = 0;

public void registra(Funcionario funcionario) {

this.totalDeBonificacoes += funcionario.getBonificacao();

}

public double getTotalDeBonificacoes() {

return this.totalDeBonificacoes;

}

}

E essa classe que possui o método main:

ControleDeBonificacoes controle = new ControleDeBonificacoes();

Gerente funcionario1 = new Gerente();

funcionario1.setSalario(5000.0);

controle.registra(funcionario1);
Funcionario funcionario2 = new Funcionario();

funcionario2.setSalario(1000.0);

controle.registra(funcionario2);

System.out.println(controle.getTotalDeBonificacoes());

Então pelo o que eu entendi junto com as explicações de vocês eu não
irei criar um novo objeto apartir de registra(Funcionario funcionario), estou
apenas dizendo que o que será usado ali como argumento será um
objeto do tipo Funcionario e irei atribuir sua referência a uma variável, que no
caso é funcionario correto?

Então seguindo o código logo acima que coloquei,

Funcionario funcionario2 = new Funcionario();

funcionario2.setSalario(1000.0);

controle.registra(funcionario2);

O intuito de colocar um argumento de objeto do tipo Funcionario: registra(Funcionario funcionario), é colocar
um objeto já existente(não necessarimente) para o objeto controle calcular as bonificações apartir
do atributo salario de cada objeto do tipo Funcionário que eu colocar como argumento, correto?

Porque consigo colocar como argumento então, Gerente funcionario1 = new Gerente()?
Porque Gerente extends de Funcionario?

E no caso de eu criar um novo objeto:

controle.registra(new Funcionario());

qual será o nome da variavel que irá guarda a referencia desse objeto?

Pessoal desculpa por estar dando trabalho, se eu não tirar minhas dúvidas fico loco.

Abração

ViniGodoy

Luan, por favor, siga essas dicas: http://www.guj.com.br/posts/list/50115.java

adrianoneres

Então Luan,

você consegue passar um gerente porque Gerente extends Funcionario

isso quer dizer que ele é um Funcionario, por isso pode ser passado também como argumento.

no caso de você criar:

controle.registra(new Funcionario());

bom, no seu caso não vai ter nenhuma utilidade. O funcionario criado vai se comportar como um objeto local, que não poderá ser recuperado fora do método - a não ser que você atribua ele, dentro do método, a um funcionário que seja um objeto global. Mas enfim, eu te dei este exemplo apenas para mostrar que não é obrigatório passar um objeto que já existe.

Mas é isso aí, o que você já entendeu até agora tá correto sim :smiley:

Francisco_Silva

Amigo, apesar de você ter entendido a parte funcional do código, ainda falta entender sobre OO em java.

Em geral você esta indo bem porem acho que esta se confundindo em relação a objeto.

Em java você não passa objeto por argumento, na verdade só passa um valor indicando a referencia desse objeto... E não se manipula o objeto diretamente, se usa variáveis de referencia para isso.

Porque consigo colocar como argumento então, Gerente funcionario1 = new Gerente()? Porque Gerente extends de Funcionario?
Sim! Exatamente. Isso é chamado de Polimorfismo com herança!
E no caso de eu criar um novo objeto:

controle.registra(new Funcionario());

qual será o nome da variavel que irá guarda a referencia desse objeto?
Não se sabe apenas olhando a chamada do método, é preciso olhar diretamente no método...
public void registra(Funcionario funcionario) { 
	this.totalDeBonificacoes += funcionario.getBonificacao(); 
}
O nome da variável que ira guardar a referencia do objeto criado será a variável local "funcionario", e essa variável só permanecera na memória durante a execução do método registra e por conseqüência o objeto referenciado será abandonado e se perdera, a não ser se referencia-lo a outra variável que não seja uma variável local do método...
Funcionario variavelNaoLocal = null;

public void registra(Funcionario funcionario) { 
	this.totalDeBonificacoes += funcionario.getBonificacao(); 
	
	variavelNaoLocal = funcionario; //Note aqui duas variáveis que referenciam ao mesmo objeto, as variáveis "funcionario" e "variavelNãoLocal", variavelNãoLocal nesse caso permanecera na memória mesmo depois de terminada a execução do método e por isso o objeto não se perdera.
}

Se você entende isso já é um bom começo... mais também aconselho a estudar mais sobre os conceitos de OO, (tipos de variáveis, métodos, classes, objetos e principalmente polimorfismo com herança e interface) ai sim tudo ficara claro como a luz.

Pessoal desculpa por estar dando trabalho, se eu não tirar minhas dúvidas fico loco.
Não se preocupa, essa é a principal finalidade desse fórum...

Só mais uma coisa... do modo que você tem postado o seu código fica difícil para entendermos.
De uma olhada no link passado pelo ViniGodoy.

Criado 22 de dezembro de 2010
Ultima resposta 22 de dez. de 2010
Respostas 6
Participantes 4