Estou com uma série de dúvidas sobre o assunto , grande parte eu achei a resposta no google o restante delas postarei aki.
Neste exercício são usadas as seguintes classes
SalariedEmployee é um Employee , HourlyEmployee é um Employee
BasePlusCommissionEmployee é um CommissionEmployee é um Employee
Vo colar a classe Employe e a classe Princiapl;
// Fig. 10.4: Employee.java
// Superclasse abstrata Employee.
public abstract class Employee
{
private String firstName;
private String lastName;
private String socialSecurityNumber;
// construtor com três argumentos
public Employee( String first, String last, String ssn )
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
} // fim do construtor Employee com três argumentos
// configura o nome
public void setFirstName( String first )
{
firstName = first;
} // fim do método setFirstName
// retorna o nome
public String getFirstName()
{
return firstName;
} // fim do método getFirstName
// configura o sobrenome
public void setLastName( String last )
{
lastName = last;
} // fim do método setLastName
// retorna o sobrenome
public String getLastName()
{
return lastName;
} // fim do método getLastName
// configura o CIC
public void setSocialSecurityNumber( String ssn )
{
socialSecurityNumber = ssn; // deve validar
} // fim do método setSocialSecurityNumber
// retorna o CIC
public String getSocialSecurityNumber()
{
return socialSecurityNumber;
} // fim do método getSocialSecurityNumber
// retorna a representação de String do objeto Employee
public String toString()
{
return String.format( "%s %s\nsocial security number: %s",
getFirstName(), getLastName(), getSocialSecurityNumber() );
} // fim do método toString
// método abstrato sobrescrito pelas subclasses
public abstract double earnings(); // nenhuma implementação aqui
} // fim da classe abstrata Employee
// Fig. 10.9: PayrollSystemTest.java
// Programa de teste da hierarquia Employee.
public class PayrollSystemTest
{
public static void main( String args[] )
{
// cria objetos de subclasse
SalariedEmployee salariedEmployee =
new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 );
HourlyEmployee hourlyEmployee =
new HourlyEmployee( "Karen", "Price", "222-22-2222", 16.75, 40 );
CommissionEmployee commissionEmployee =
new CommissionEmployee(
"Sue", "Jones", "333-33-3333", 10000, .06 );
BasePlusCommissionEmployee basePlusCommissionEmployee =
new BasePlusCommissionEmployee(
"Bob", "Lewis", "444-44-4444", 5000, .04, 300 );
System.out.println( "Employees processed individually:\n" );
System.out.printf( "%s\n%s: $%,.2f\n\n",
salariedEmployee, "earned", salariedEmployee.earnings() );
System.out.printf( "%s\n%s: $%,.2f\n\n",
hourlyEmployee, "earned", hourlyEmployee.earnings() );
System.out.printf( "%s\n%s: $%,.2f\n\n",
commissionEmployee, "earned", commissionEmployee.earnings() );
System.out.printf( "%s\n%s: $%,.2f\n\n",
basePlusCommissionEmployee,
"earned", basePlusCommissionEmployee.earnings() );
// cria um array Employee de quatro elementos
Employee employees[] = new Employee[ 4 ];
// inicializa o array com Employees
employees[ 0 ] = salariedEmployee;
employees[ 1 ] = hourlyEmployee;
employees[ 2 ] = commissionEmployee;
employees[ 3 ] = basePlusCommissionEmployee;
System.out.println( "Employees processed polymorphically:\n" );
// processa genericamente cada elemento no employees
for ( Employee currentEmployee : employees )
{
System.out.println(currentEmployee); // invoca toString
// determina se elemento é um BasePlusCommissionEmployee
if (currentEmployee instanceof BasePlusCommissionEmployee)
{
// downcast da referência de Employee para
// referência a BasePlusCommissionEmployee
BasePlusCommissionEmployee employee =
( BasePlusCommissionEmployee ) currentEmployee;
double oldBaseSalary = employee.getBaseSalary();
employee.setBaseSalary( 1.10 * oldBaseSalary );
System.out.printf(
"new base salary with 10%% increase is: $%,.2f\n",
employee.getBaseSalary() );
} // fim do if
System.out.printf(
"earned $%,.2f\n\n", currentEmployee.earnings());
} // for final
// obtém o nome do tipo de cada objeto no array employees
for ( int j = 0; j < employees.length; j++ )
System.out.printf( "Employee %d is a %s\n", j,
employees[ j ].getClass().getName() );
} // fim de main
} // fim da classe PayrollSystemTest
Dúvidas :
1-Pq q nessa classe principal qnd o método ToString vai ser chamado não é necessário usar por ex. HourlyEmployee.ToString ?Neste exemplo eles chamam o método apenas usando o ponteiro do array, as como o prog sabe que é pra chamar o método ToString e não outro ?
2-Q q acontece neste trecho ?
BasePlusCommissionEmployee employee =
( BasePlusCommissionEmployee ) currentEmployee;
Iste é um downcast , certo ? Mas o q seria um downcast, qual a sua função?
[color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Jair Elton :joia: [/color]