Pergunta sobre this e metodos sobrecarregados

Bom, gente estou estudando JAVA pelo DEITEL, e agora tenho uma duvida, como e que funciona o this ?

por que tem um exemplo aqui no livro de construtores sobrecarregados, nesse exemplo todos os construtores quando são chamados usam this para referenciar as variaveis menos 1 esse e o mais completo, porem como e que os outros construtores sabem que tem que chamar aquele que nao usa this na declaração ?

o codigo esta ai embaixo dêem uma olhada nos construtores… tipo e assim e pronto ? o construtor sem this e o principal e o resto referencia sua atribuição de valores ?

no livro que alias e muito bom, infelizmente isso não ficou bem claro para mim !

Valeu.

[code]
// Fig. 8.5: Time2.java
// declaração da classe Time2 com construtores sobrecarregados.

public class Time2
{
private int hour; // 0 - 23
private int minute; // 0 - 59
private int second; // 0 - 59

// construtor sem argumento Time2 : inicializa cada variável de instância
// com zero; assegura que objetos Time2 iniciam em um estado consistente
public Time2()
{
this( 0, 0, 0 ); // invoca o construtor Time2 com três argumentos
} // fim do construtor sem argumento Time2

// Construtor Time2: hora fornecida, minuto e segundo padronizados para 0
public Time2( int h )
{
this( h, 0, 0 ); // invoca o construtor Time2 com três argumentos
} // fim do construtor de um argumento Time2

// Construtor Time2: hora e minuto fornecidos, segundo padronizado para 0
public Time2( int h, int m )
{
this( h, m, 0 ); // invoca o construtor Time2 com três argumentos
} // fim do construtor de dois argumentos Time2

// Construtor Time2: hour, minute e second fornecidos
public Time2( int h, int m, int s )
{
setTime( h, m, s ); // invoca setTime para validar a data/hora
} // fim do construtor de três argumentos Time2

// Construtor Time2: outro objeto Time2 fornecido
public Time2( Time2 time )
{
// invoca o construtor de três argumentos Time2
this( time.getHour(), time.getMinute(), time.getSecond() );
} // fim do construtor Time2 com um argumento de objeto Time2

// Métodos set
// configura um novo valor de data/hora usando UTC; assegura que
// os dados permaneçam consistentes configurando valores inválidos como zero
public void setTime( int h, int m, int s )
{
setHour( h ); // configura hour
setMinute( m ); // configura minute
setSecond( s ); // configura second
} // fim do método setTime

// valida e configura a hora
public void setHour( int h )
{
hour = ( ( h >= 0 && h < 24 ) ? h : 0 );
} // fim do método setHour

// valida e configura os minutos
public void setMinute( int m )
{
minute = ( ( m >= 0 && m < 60 ) ? m : 0 );
} // fim do método setMinute

// valida e configura os segundos
public void setSecond( int s )
{
second = ( ( s >= 0 && s < 60 ) ? s : 0 );
} // fim do método setSecond

// Métodos get
// obtém valor da hora
public int getHour()
{
return hour;
} // fim do método getHour

// obtém valor dos minutos
public int getMinute()
{
return minute;
} // fim do método getMinute

// obtém valor dos segundos
public int getSecond()
{
return second;
} // fim do método getSecond

// converte em String no formato de data/hora universal (HH:MM:SS)
public String toUniversalString()
{
return String.format(
“%02d:%02d:%02d”, getHour(), getMinute(), getSecond() );
} // fim do método do toUniversalString

// converte em String no formato padrão de data/hora (H:MM:SS AM ou PM)
public String toString()
{
return String.format( “%d:%02d:%02d %s”,
( (getHour() == 0 || getHour() == 12) ? 12 : getHour() % 12 ),
getMinute(), getSecond(), ( getHour() < 12 ? “AM” : “PM” ) );
} // fim do método toString
} // fim da classe Time2

/**************************************************************************

  • © Copyright 1992-2005 by Deitel & Associates, Inc. and *
  • Pearson Education, Inc. All Rights Reserved. *
  •                                                                    *
    
  • DISCLAIMER: The authors and publisher of this book have used their *
  • best efforts in preparing the book. These efforts include the *
  • development, research, and testing of the theories and programs *
  • to determine their effectiveness. The authors and publisher make *
  • no warranty of any kind, expressed or implied, with regard to these *
  • programs or to the documentation contained in these books. The authors *
  • and publisher shall not be liable in any event for incidental or *
  • consequential damages in connection with, or arising out of, the *
  • furnishing, performance, or use of these programs. *
    *************************************************************************/[/code]

O this() chama outro construtor da mesma classe, o construtor a ser chamado é definido pelos parametros que são passados, ex.:

[code]public class Teste{
public Teste(){
this(10);
}

public Teste(String str){
}

public Teste(int i){
}
}[/code]

Nesse caso ao chamar new Teste(), será chamado o construtor sem parametros, que ao chamar this(10); chama o outro construtor que recebe um int, e ele sabe que é pra chamar o que recebe um int pelo tipo de parametro que você está passando, se você colocar uma String no this() ele chama o construtor Teste(String str).

Ah, entendi, como no meu exemplo todos os construtores, declaram 3 int todos chama o mesmo so que com valores diferentes…

mas então pelo menos um dos contrutores tem que usar a declaração normal e nao this(), certo ?

Se você chamar o construtor passando 3 parâmetros para ele, ele não chamará algum outro, com a chamada this e sim chamará o método set… para atribuir os valores. Caso você chame algum construtor e não passar os 3 parâmetros, ele chamará o construtor que recebe 3 parâmetros e passará 0 para os parâmetros que você não passar. Esta chamada é através do this.

Flw