Duvida de sintase...Não compila...Ajuda?

Folks,

porque o codigo abaixo não compila…


class Tipo {
	    Tipo(String texto) {
	       this(Integer.parseInt(texto));
	       System.out.println("Texto: " + texto);
	    }
	    Tipo(int valor) {
	       this("" + valor);
	       System.out.println("Valor " + valor);
	    }
	 }
	 public class Teste {
	   public static void main(String args[]) {
	     Tipo tipo = new Tipo("15");
	   }
	 } 

Oi,

Tá ocorrendo recursividade sem fim em seus construtores, repare que this dentro de cada um dos construtores força a chamada do outro (cada um chamando com o tipo de parametro diferente) construtor e isso vira um loop infinito que é barrado na compilação…é possível fazer um construtor chamar outro, porém tem que ter cuidado com esse problema.

this(Integer.parseInt(texto)); this("" + valor);

Vc teria q criar umas variaveis pra guardar esses valores…

ai teria q ficar ± assim:

String valor_str; int valor_int; ... this.valor_int=(Integer.parseInt(texto)); ... this.valor_str=("" + valor);

Obs.: o “this” é usado para apontar algo da propria classe, geralmente utilizado qdo parametros de metodos tem o mesmo nome de um atributo da classe.

Quando existem construtores sobrecarregados (que é o caso) o this(); é utilizado justamente para chama-los, assim como o super(); é utilizado para chamar os construtores da superclasse. Por isso que o código não compila, tá ocorrendo loop infinito entre os dois construtores que ele criou tá um chamando o outro, pois um o do int tá chamado com String e vice-versa.

Se não me engano, na versão 1.4 da JVM, isto causava estouro da pilha.

Antes de mais nada, se o código do colega está em um único arquivo .java isso causa erro de compilação pois só podemos ter uma classe pública por arquivo!!

Corrigido esse erro, como o Rafael citou, há erro de compilação pela chamada cíclica dos construtores

//não sabia disso, se caísse ma SCJP teria perdido a questão :) Error(2,9): cyclic `this' constructor calls involving constructor Class3(java.lang.String) Error(6,9): cyclic `this' constructor calls involving constructor Class3(int)

agora se, ao invés do construtor fosse um método chamando o outro, ou a ele mesmo, ele compila, roda e dá a seguinte exceção

Exception in thread “main” java.lang.StackOverflowError

Mas só existe uma classe pública no código dele, não?

My bad, troquei o nome da classe default para o arquivo que eu tinha aqui, ao invés da que tinha o acesso public.

Quando existem construtores sobrecarregados (que é o caso) o this(); é utilizado justamente para chama-los, assim como o super(); é utilizado para chamar os construtores da superclasse. Por isso que o código não compila, tá ocorrendo loop infinito entre os dois construtores que ele criou tá um chamando o outro, pois um o do int tá chamado com String e vice-versa.[/quote]

É isso mesmo, vai estourar a pilha, certeza. Resolvido.