[RESOLVIDO] Para que server o () antes de acessar o método?

17 respostas
alexandref93

Então galera, minha dúvida é o seguinte, criei um objeto JFrame e acessei o método setSize dele, frame.setSize(500, 500); blz, até ae eu entendi tudo, mais por exemplo em situação como essa frame.getContentPane().add(button); por que vai o “()” depois getContentPane ??? Não entendi isso!!!

Obrigado pela atenção!!!

17 Respostas

thiago.correa

É um método do JFrame que não recebe nenhum parâmetro!

Giulliano

A verdade vai muito além disto. Este parentêses foi definido pelos criadores da linguagem Java para deixar explicito que vc esta invocando um método. Em Ruby, por exemplo os parantêses não são obrigatórios.

thiago.correa

A verdade vai muito além disto. Este parentêses foi definido pelos criadores da linguagem Java para deixar explicito que vc esta invocando um método. Em Ruby, por exemplo os parantêses não são obrigatórios.

Que quer dizer que você está invocando um método sem parâmetros! :evil:

alexandref93

A verdade vai muito além disto. Este parentêses foi definido pelos criadores da linguagem Java para deixar explicito que vc esta invocando um método. Em Ruby, por exemplo os parantêses não são obrigatórios.

Que quer dizer que você está invocando um método sem parâmetros! :evil:

aaahhh acho que entendi, então seria um método invocando outro método no caso o add??? correto???

davidbuzatto

Calma pessoal... Calma...

Alexandre, o que acontece é o seguinte:

// isso aqui
frame.getContentPane().add(button);

// é a mesma coisa que isso aqui
Container container = frame.getContentPane();
container.add(button);

Entendeu? Você encadeia os métodos, chamando um método no retorno de outro método.

[]´s

Marky.Vasconcelos

alexandref93:

aaahhh acho que entendi, então seria um método invocando outro método no caso o add??? correto???

Não exatamente, não é um método invocando outro. Voce esta invocando um método do objeto retornado do primeiro método.

No caso, getContentPane() retorna um Container, e o método add é do Container.

Perceba que voce nao pode fazer isso quando métodos tem retorno ‘void’, por que ele não tem um objeto para invocar outro método.
PS: A não ser que seja modificado e implementam algo chamado Implicit Covariant Return, onde métodos ‘void’ sempre tem ‘return this;’ implicitamente e voce pode fazer chamadas encadeadas no mesmo objeto.

thiago.correa

Marky.Vasconcelos:

PS: A não ser que seja modificado e implementam algo chamado Implicit Covariant Return, onde métodos ‘void’ sempre tem ‘return this;’ implicitamente e voce pode fazer chamadas encadeadas no mesmo objeto.

Gostei dessa mudança em partes, vai trazer praticidade na codificação, mas em contrapartida acho que aí começa a distorcer muito a linguagem!

alexandref93
davidbuzatto:
Calma pessoal... Calma...

Alexandre, o que acontece é o seguinte:

// isso aqui
frame.getContentPane().add(button);

// é a mesma coisa que isso aqui
Container container = frame.getContentPane();
container.add(button);

Entendeu? Você encadeia os métodos, chamando um método no retorno de outro método.

[]´s

oO, acho que perdi mais ainda, pera ae, meu, acho que agora não entendi de vez!! =s!

Z
class Pessoa{

public String method(String teste){
return teste;
}
}

System.out.println(new Pessoa().method("teste"));

É a mesma coisa. =D Fiz rapido e ficou mto ruim…arrumando…rss

kenneth

Camarada,

Leia com atencao a resposta do Marky…

Vou tentar dar um exemplo… Vamos supor que voce tenha uma classe Pedido.
Esse pedido foi feito por um cliente, que, por sua vez, tem uma razao social.

Digamos que voce queira imprimir o nome do cliente:

Pedido ped = dao.getPedido(1); // Um pedido gravado no banco, por exemplo...
  // ped eh do tipo Pedido, e dentro dela existe um atributo Cliente
  // Entao, pra pegar o nome, voce vai pegar o cliente daquele pedido, e com isso em maos, pegar a razao dele.
  System.out.println("Nome: " + ped.getCliente().getRazao());
  // Seria a mesma coisa que:
  Cliente cliente = ped.getCliente();
  cliente.getNome();

Nao sei se foi mto claro, mas vamos la
=]

alexandref93

kenneth:
Camarada,

Leia com atencao a resposta do Marky…

Vou tentar dar um exemplo… Vamos supor que voce tenha uma classe Pedido.
Esse pedido foi feito por um cliente, que, por sua vez, tem uma razao social.

Digamos que voce queira imprimir o nome do cliente:

Pedido ped = dao.getPedido(1); // Um pedido gravado no banco, por exemplo...
  // ped eh do tipo Pedido, e dentro dela existe um atributo Cliente
  // Entao, pra pegar o nome, voce vai pegar o cliente daquele pedido, e com isso em maos, pegar a razao dele.
  System.out.println("Nome: " + ped.getCliente().getRazao());
  // Seria a mesma coisa que:
  Cliente cliente = ped.getCliente();
  cliente.getNome();

Nao sei se foi mto claro, mas vamos la
=]

bem, vamos ver se eu entendi!

La na classe, eu instanciei um objeto, blz… esse objeto possui um retorno de um outro objeto que possui um certo método!!! é isso???

thiagobaptista
alexandref93:
La na classe, eu instanciei um objeto, blz.... esse objeto possui um retorno de um outro objeto que possui um certo método!!! é isso????

Quase, mas o raciocínio é esse mesmo! Você instanciou um objeto, e esse objeto tem um método, que esse sim tem um retorno.

Só que o retorno desse método é um outro objeto... que também tem um método!

Então, quando você faz isso:

Beltrano beltrano = fulano.retornaUmCicrano().retornaUmBeltrano();

Na verdade, você está fazendo isso:

//O objeto "fulano" tem um método chamado retornaUmCicrano()
Cicrano cicrano = fulano.retornaUmCicrano();

//Por sua vez, o objeto "cicrano" tem TAMBÉM um método, o retornaUmBeltrano()
Beltrano beltrano = cicrano.retornaUmBeltrano();

Na verdade, o que você está fazendo é encadear a chamada de métodos, o que é uma característica da linguagem Java. Pra facilitar a nossa vida. Porque assim a gente "economiza" digitação, e porque o código fica mais legível.

Isso permite inclusive que determinados frameworks criem praticamente uma "linguagem nova de programação", tornando possíveis códigos como esse:

seResultado().forMenorQue(15).exiba().lista().em().html();

Um framework, aliás, que usa isso é o Vraptor 3, do pessoal da Caelum. Recomendo muito!

kenneth

thiagobaptista

(Mudando um pouco o assunto do topico…)

Brother, vou precisar estudar VRaptor, e como vi que voce mencionou ali,
tem alguma sugestao pra comecar a estudar?

Henrique.tenorio

Entedimento-------------------- o JFrame é um objeto certo!? esse objeto é composto por outros objetos certo!? um carro possui um cambio certo?! o carro é um objeto e cambio tambem certo?!. Logo o cambio faz parte do carro. O JFrame possui um painel de conteudos ( Uma parte do JFrame - objeto que ajuda ele ) getContentPane() retorna uma parte do JFrame um objeto é claro. E como todos os objetos possuem metodos getContentPane()-> um objeto que foi retornado possui metodos como o add() , getContentPane().add( botao ). Ou
carro.getCambio().proximaMarcha( 2 ). Qualquer coisa estamos ae T+

thiagobaptista

No site da própria Caelum, além do treinamento que eles oferecem de VRaptor, há uma apostila gratuita pra se baixar. O legal é que essa apostila aborda também um pouco de Hibernate.

Também há o site oficial do VRaptor, que tem alguns tutoriais muito bons e a documentação oficial.

alexandref93
thiagobaptista:
alexandref93:
La na classe, eu instanciei um objeto, blz.... esse objeto possui um retorno de um outro objeto que possui um certo método!!! é isso????

Quase, mas o raciocínio é esse mesmo! Você instanciou um objeto, e esse objeto tem um método, que esse sim tem um retorno.

Só que o retorno desse método é um outro objeto... que também tem um método!

Então, quando você faz isso:

Beltrano beltrano = fulano.retornaUmCicrano().retornaUmBeltrano();

Na verdade, você está fazendo isso:

//O objeto "fulano" tem um método chamado retornaUmCicrano()
Cicrano cicrano = fulano.retornaUmCicrano();

//Por sua vez, o objeto "cicrano" tem TAMBÉM um método, o retornaUmBeltrano()
Beltrano beltrano = cicrano.retornaUmBeltrano();

Na verdade, o que você está fazendo é encadear a chamada de métodos, o que é uma característica da linguagem Java. Pra facilitar a nossa vida. Porque assim a gente "economiza" digitação, e porque o código fica mais legível.

Isso permite inclusive que determinados frameworks criem praticamente uma "linguagem nova de programação", tornando possíveis códigos como esse:

seResultado().forMenorQue(15).exiba().lista().em().html();

Um framework, aliás, que usa isso é o Vraptor 3, do pessoal da Caelum. Recomendo muito!

vlw, agora entendi tudo direito, fiz uns teste, entendi certinho agora!!!

Obrigado pela atenção!!!

discorpio

Boa tarde a todos.

A verdade vai muito além disto. Este parentêses foi definido pelos criadores da linguagem Java para deixar explicito que vc esta invocando um método. Em Ruby, por exemplo os parantêses não são obrigatórios.

Com poucas palavras, o nosso amigo Giulliano definiu um dos verdadeiros motivos de se usar sempre os parenteses na chamada de métodos, como também no momento de suas declarações em Java. Eles não só servem para identificar os métodos, como também servem para passar parâmetros para os procedimentos invocados e a mesmo tempo receber os valores de retorno do procedimento executado e armazená-los. Como assim :?:

Alguém já perguntou onde é que são armazenado os valores ou a referência de retorno do métodos :?: Simplesmente são armazenados nos nomes dos métodos, que funcionam como se fossem variáveis normais primitivas ou de instâncias, só que com o recurso especial de receber os seus valores após um procedimento ser executado, justamente através dos parenteses, dai a necessidade de colocar os parenteses , tanto na chamada quanto na declaração do método.

No caso dos métodos “void”, que virtualmente não retornam nada, na verdade eles retornam uma referência nula, como se fosse um objeto nulo.

Assim como no Ruby, também o Object Pascal do Delphi, não há necessidade de usar os parenteses, exceto na passagem de parâmetros, sendo eles apenas opcional, isto porque os compiladores do Delphi tem um recurso de mapeamento de ponteiros da memória que diferencia as variáveis que são métodos e as que são apenas variáveis comuns e variáveis de instâncias. Não sei quanto ao Ruby, se funciona da mesma forma

Criado 22 de setembro de 2010
Ultima resposta 23 de set. de 2010
Respostas 17
Participantes 10