Pergunta sobre this e metodos sobrecarregados

3 respostas
S

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.

// 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


/**************************************************************************
 * (C) 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.                     *
 *************************************************************************/

3 Respostas

J

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

public class Teste{
   public Teste(){
      this(10);
   }

   public Teste(String str){
   }

   public Teste(int i){
   }
}

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).

S

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 ?

R

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

Criado 15 de março de 2007
Ultima resposta 15 de mar. de 2007
Respostas 3
Participantes 3