Instanciar

9 respostas
javahunter

Porque isso não funciona:

Thi objt = new Thi().dados(10);

mas assim roda:

Thi objt = new Thi(); objt.dados(10);

9 Respostas

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…

rmendes08

javahunter:
Porque isso não funciona:

Thi objt = new Thi().dados(10);

mas assim roda:

Thi objt = new Thi(); objt.dados(10);

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.

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!

javahunter

Obrigado pela ajuda galera,

postei isso porque em outro post aqui no fórum alguém colocou dessa maneira, na íntegra fica assim:
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();
  
	}
}
e nos comentários seguintes o pessoal começou colocar que tava funcionado
rmendes08

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…

Na verdade, a construção:

new Objeto().metodo()

é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) .

javahunter

é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) .
Legal… não sabia dessa!

rmendes08

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!

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);
  }
}
lina
rmendes08:
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!

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

Oi,

Pois é. Eu não curto muito não =/

Tchauzin!

darklordkamui

rmendes08:
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…

Na verdade, a construção:

new Objeto().metodo()

é perfeitamente válida, pois o operador new é avaliado antes do operador . (ponto) .

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…

Criado 31 de janeiro de 2013
Ultima resposta 31 de jan. de 2013
Respostas 9
Participantes 4