Dúvida sobre métodos?

3 respostas
D

Pessoal, estou com uma dúvida, segue o programa:

public class Date 
{
   private int month; // 1-12
   private int day;   // 1-31 conforme o mês
   private int year;  // qualquer ano

   // construtor: chama checkMonth para confirmar o valor adequado para month;
   // chama checkDay para confirmar o valor adequado para day
   public Date( int theMonth, int theDay, int theYear )
   {
      month = checkMonth( theMonth ); // valida month
      year = theYear; // poderia validar year
      day = checkDay( theDay ); // valida day

      System.out.printf( 
         "Date object constructor for date %s\n", this );
   } // fim do construtor Date

   // método utilitário para confirmar o valor adequado de month
   private int checkMonth( int testMonth )
   {
      if ( testMonth > 0 && testMonth <= 12 ) // valida month
         return testMonth;
      else // month é inválido
      { 
         System.out.printf( 
            "Invalid month (%d) set to 1.", testMonth );
         return 1; // mantém objeto em estado consistente
      } // fim de else
   } // fim do método checkMonth

   // método utilitário para confirmar o valor adequado de day com base em month e year
   private int checkDay( int testDay )
   {
      int daysPerMonth[] = 
         { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
   
      // verifica se day está no intervalo para month
      if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
         return testDay;
   
      // verifica ano bissexto
      if ( month == 2 && testDay == 29 && ( year % 400 == 0 || 
           ( year % 4 == 0 && year % 100 != 0 ) ) )
         return testDay;
   
      System.out.printf( "Invalid day (%d) set to 1.", testDay );
      return 1;  // mantém objeto em estado consistente
   } // fim do método checkDay
   
   // retorna uma String no formato mês/dia/ano
   public String toString()
   { 
      return String.format( "%d/%d/%d", month, day, year ); 
   } // fim do método toString
} // fim da classe Date
public class Employee 
{
   private String firstName;
   private String lastName;
   private Date birthDate;
   private Date hireDate;

   // construtor para inicializar nome, data de nascimento e data de contratação
   public Employee( String first, String last, Date dateOfBirth, 
      Date dateOfHire )
   {
      firstName = first;
      lastName = last;
      birthDate = dateOfBirth;
      hireDate = dateOfHire;
   } // fim do construtor Employee

   // converte Employee em formato de String
   public String toString()
   {
      return String.format( "%s, %s  Hired: %s  Birthday: %s", 
         lastName, firstName, hireDate, birthDate );
   } // fim do método toString
} // fim da classe Employee
public class EmployeeTest 
{
   public static void main( String args[] )
   {
      Date birth = new Date( 7, 24, 1949 );
      Date hire = new Date( 3, 12, 1988 );
      Employee employee = new Employee( "Bob", "Blue", birth, hire );

      System.out.println( employee );
   } // fim de main
} // fim da classe EmployeeTest

no EmployeeTest, quando eu crio o objeto birth, ele chama o construtor, aí no contrutor de date tem um printf com o this, eu não entendi pq o this chama o método toString() da classe date? Eu vi que se deixar sem o método ele imprime lixo.
Outra dúvida é a seguinte, quando eu dou o System.out.println( employee ), ele chama o método toString de Employee, eu tbm não entendi o pq, já que seria a mesma coisa que se eu colocasse employee.toString();
Se puderem me ajudar eu agradeceria.

3 Respostas

D

Basicamente, se você usa um objeto qualquer em um lugar onde o Java esperaria uma String, o compilador insere uma chamada a toString automaticamente.

E a implementação padrão de toString imprime apenas a classe e o identity hash do objecto, que é aquele ‘lixo’ que você viu.

D

domingos.neto:
Basicamente, se você usa um objeto qualquer em um lugar onde o Java esperaria uma String, o compilador insere uma chamada a toString automaticamente.

E a implementação padrão de toString imprime apenas a classe e o identity hash do objecto, que é aquele ‘lixo’ que você viu.

Ah sim, entendi, então sempre que o objeto esperar uma string ele chamará implicitamente o método toString.
Tem essa regra pra int, double, etc tbm?

D

Acho que causei uma pequena confusão. Na verdade, lendo seu exemplo com calma, eu retiro o que eu disse ali em cima.

O que acontece na verdade aí é que você está chamando System.out.println(Object). O resultado final é o mesmo, o método toString() do seu object é chamado pela implementação interna deste método.

As horas em que o java embute uma chamada implícta de toString é quando você faz concatenação de Strings, exemplo:

System.out.println("The employee is " + employee);

Respondendo sua segunda pergunta: também funciona com int, double etc:

int i = 2008;
System.out.println(i); // imprime apenas 2008
System.out.println("O valor atual é " + 2008);

O que não funciona:

public void meuMetodoQueAceitaStrings(String s) {
  System.out.println(s);
}

public void testarStrings() {
  Object obj = new Employee(<argumentos do construtor arqui>);
  meuMetodoQueAceitaStrings(obj);
}
Criado 2 de agosto de 2008
Ultima resposta 2 de ago. de 2008
Respostas 3
Participantes 2