Porque isso não funciona:
Thi objt = new Thi().dados(10);
mas assim roda:
Thi objt = new Thi();
objt.dados(10);
Porque isso não funciona:
Thi objt = new Thi().dados(10);
mas assim roda:
Thi objt = new Thi();
objt.dados(10);
nao funciona pois ate o momento que vc da new o objeto nao existe… logo vc nao pode fazer a chamada de nenhum metodo dele…
vc só pode chamar o metodo de algo que em teoria esta instanciado… mas nao necessariamente estando, o compilador java é inteligente neste ponto… assim vc evita de tomar nullpointer de graça, logo isso nao compila…
[quote=javahunter]Porque isso não funciona:
Thi objt = new Thi().dados(10);
mas assim roda:
Thi objt = new Thi();
objt.dados(10);
[/quote]
Por causa de uma coisa chamada de precedência de operadores. O operador = (atribuição) é o operador de mais baixa precedência, ou seja, ele é o último operador a ser avaliado em uma expressão. Assim, em uma expressão var = exp, todo o lado direito da expressão será avaliado antes.
Nesse caso, os operadores são avaliados na seguinte ordem:
new
. (ponto)
= (atribuição)
Ou seja, as coisas acontecerão na seguinte ordem:
1 - um objeto da classe This é criado
2- o método dados() é invocado
3 - o resultado da invocação do método seria atribuido à variável objt
Como o retorno de dados deve ser diferente de This(), então a expressão não compila.
Oi,
A não ser que o método dados(int) retornasse algo como this.
public
Thi dados(int an) {
// faz qualquer coisa com o parametro.
return this;
}
o que não faria sentido algum.
Tchauzin!
Obrigado pela ajuda galera,
postei isso porque em outro post aqui no fórum alguém colocou dessa maneira, na íntegra fica assim:
[code]public class Thi{
int idade;
public void dados(int idade){
this.idade = idade;
}
public void exibe() {
System.out.println(idade);
}
public static void main(String ar[]){
Thi objt = new Thi().dados(10);
objt.exibe();
}
}[/code]
e nos comentários seguintes o pessoal começou colocar que tava funcionado
[quote=darklordkamui]nao funciona pois ate o momento que vc da new o objeto nao existe… logo vc nao pode fazer a chamada de nenhum metodo dele…
vc só pode chamar o metodo de algo que em teoria esta instanciado… mas nao necessariamente estando, o compilador java é inteligente neste ponto… assim vc evita de tomar nullpointer de graça, logo isso nao compila…[/quote]
Na verdade, a construção:
new Objeto().metodo()
é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) .
é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) . [/quote]
Legal… não sabia dessa!
[quote=lina]Oi,
A não ser que o método dados(int) retornasse algo como this.
public
Thi dados(int an) {
// faz qualquer coisa com o parametro.
return this;
}
o que não faria sentido algum.
Tchauzin![/quote]
Na verdade, até faria sentido sim. Alguns programadores gostam de um estilo herdado do Smalltalk(nessa linguagem, todo método é obrigado a ter um tipo de retorno, assim, métodos set retornam this) que permite um encadeamento interessante de métodos:
class Pessoa{
String nome; int idade;
public Pessoa setNome(String nome){ this.nome = nome; return this; }
public Pessoa setIdade(int idade){this.idade = idade; return this;}
public void main(String ... args){
Pessoa p1 = new Pessoa().setNome("joao da silva").setIdade(20);
Pessoa p2 = new Pessoa().setNome("maria").setIdade(25);
}
}
[quote=rmendes08][quote=lina]Oi,
A não ser que o método dados(int) retornasse algo como this.
public
Thi dados(int an) {
// faz qualquer coisa com o parametro.
return this;
}
o que não faria sentido algum.
Tchauzin![/quote]
Na verdade, até faria sentido sim. Alguns programadores gostam de um estilo herdado do Smalltalk(nessa linguagem, todo método é obrigado a ter um tipo de retorno, assim, métodos set retornam this) que permite um encadeamento interessante de métodos:
[code]
class Pessoa{
String nome; int idade;
public Pessoa setNome(String nome){ this.nome = nome; return this; }
public Pessoa setIdade(int idade){this.idade = idade; return this;}
public void main(String … args){
Pessoa p1 = new Pessoa().setNome(“joao da silva”).setIdade(20);
Pessoa p2 = new Pessoa().setNome(“maria”).setIdade(25);
}
}
[/code] [/quote]
Oi,
Pois é. Eu não curto muito não =/
Tchauzin!
[quote=rmendes08][quote=darklordkamui]nao funciona pois ate o momento que vc da new o objeto nao existe… logo vc nao pode fazer a chamada de nenhum metodo dele…
vc só pode chamar o metodo de algo que em teoria esta instanciado… mas nao necessariamente estando, o compilador java é inteligente neste ponto… assim vc evita de tomar nullpointer de graça, logo isso nao compila…[/quote]
Na verdade, a construção:
new Objeto().metodo()
é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) . [/quote]
realmente falei besteira, mas do jeito que ele montou não compila… pq ele espera um objeto do tipo Thi, e esta indo um int…
e o esquema de ficar dando ponto é metaprogramação… pessoalmente acho interessante mas tudo tem um limite, mas se ve muito disso na Criteria do JPA…