Instanciar

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…