Classe abstrata

Bem como nos sabemos uma classe abstrata não pode ser instancia, porque intão ela tem construtor…?
uma vez que não posso ter a instância da mesma, estou com essa dúvida porque no livro do deitel
tem uma classe abstrata com um construtor segue o código:

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

Porque essa classe tem construtor…?

Uma classe abstrata pode ter construtor sim, só que ele só poderá ser invocado por uma subclasse que a estende. Digamos que você tenha uma superclasse Employee e uma subclasse Director. O construtor de Director pode ser:

public Director( String first, String last, String ssn, double salary )  {
    super (first, last, ssn); // invoca o construtor de Employee
    earnings = salary;
}

valew thingol
super objetiva sua explicação…!

ela tem construtor pq faz parte da herança java.lang.Object o que é nao pode ser é instanciada… vc nao poder dar um new em uma classe abstrata.

Detalhe, como essa classe tem um construtor que recebe argumentos e não foi declarado um construtor sem argumentos explicitamente, toda classe que a estender ao chamar o construtor da classe super deverá passar os argumentos obrigatóriamente.

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

correto?

correto, como ela nao tem um Construtor () entao quem extends a essa classe deve chamar os seus constratores… caso contrario nao compila… se a filha nao fizer super(…, … ). o codigo nao compila! :smiley:

Uma classe abstrata define comportamento para as demais classes (classes filhas) que façam uso da herança dessa classe abstrata.

Quando instanciamos um objeto de uma classe, todos os construtores das superclasses (até chegar ao construtor de Object) da mesma são invocados obrigatoriamente.

Como uma classe abstrata “só existe para ser herdada”, ela PRECISA ter um construtor (implícito sem argumentos e com chamada a super(), ou explícito) que PRECISA obrigatoriamente ser invocado (mais uma vez implícita ou explicitamente) por suas subclasses no momento que instanciamos um objeto da subclasse.