Ir para o conteúdo

Classes Abstratas

Definição

Uma classe abstrata é um tipo de classe que não pode ser instanciada diretamente e que permite definir métodos abstratos (sem implementação) e métodos concretos (com implementação).

Os métodos abstratos devem obrigatoriamente ser implementados pelas classes que herdam dessa classe.

Objetivos

A classe abstrata permite:

  • Abstração de código
  • Permitir o uso do polimorfismo
  • Desacoplamento entre as classes

Representação em diagrama de classes da UML.

Observe que o nome da classe abstrata está em itálico. O método area() é um método abstrato, portanto está em itálico.

Código Java

A classe abstrata é definida com a palavra-reservada abstract. Os métodos abstratos devem ser indicados com esta palavra chave.

public abstract class Shape{
  public abstract double area();
}

A classe abstrata pode possuir atributos e métodos como uma classe regular.

public abstract class Shape{
  private String name;
  public abstract double area();
  public String getName(){
    return name;
  }
}

Implementação

A classe abstrata não pode ser instanciada, portanto, deve ser realizada herança. Na classe filha, os métodos abstratos devem ser implementados.

Passo 1

Indicar na classe a herança de classe abstrata. Após o nome da classe utilize a palavra-chave extends.

class Rect extends Shape{
  
}

Passo 2

A classe obrigatoriamente deve implementar todos os métodos abstratos da classe abstrata. Recomenda-se sempre utilizar a anotação @Override nos métodos implementados.

class Rect extends Shape{
   @Override
   public double area(){
     return 0;
   }
}

Instanciação

Um objeto não pode ser criado a partir de uma classe abstrata. Deve ser sempre instanciado um objeto da classe que estenda a classe abstrata.

// ERRADO
Shape s = new Shape();

// CERTO
Rect r = new Rect();

Polimorfismo

Um objeto de uma classe que extende uma classe abstrata pode ser referenciado por uma variável do tipo da classe abstrata. O uso de classes abstratas facilita a aplicação do polimorfismo.

Shape s = new Rect();

// Retornar ao objeto original,
// deve ser utilizado o operador de casting

Rect r = (Rect) s;

O casting só é seguro quando o objeto realmente é do tipo convertido. A conversão do objeto para um tipo que ele não pertença causará o erro de ClassCastException.

Múltiplas heranças de classe abstrata

A linguagem java não permite a herança de múltiplas classes.