Classe Abstrata é uma classe que NÃO pode ser instanciada e que PODE possuir métodos abstratos.
Classes abstratas NÃO GERAM OBJETOS, ou seja, não é possível utilizar a instrução new.
Seu propósito não é o de criar instâncias, mas sim servir como uma superclasse modelo para subclasses em um relacionamento de Herança.
É uma classe que existe para ser herdada. Dessa forma, ela será a base para as outras classes que serão desenvolvidas.
A sintaxe em Java para criar uma classe abstrata é adicionar o modificador abstract antes da instrução class na declaração da classe.
IMPORTANTE: Uma classe abstrata será sempre pública.
Sintaxe Java:
public abstract class NomeClasse {
//conteúdo da classe abstrata
//PODE conter métodos abstratos
}
Exemplo de definição de classe abstrata:
public abstract class Animal {}
As classes abstratas podem conter:
Atributos,
Métodos COM comportamento, e
Métodos SEM comportamento definido, que são chamados de métodos abstratos (veja o Item 3. Métodos Abstratos).
Toda classe que NÃO é abstrata é chamada de classe concreta.
Em uma classe concreta, não é permitido definir métodos abstratos (veja o Item 3. Métodos Abstratos).
No exemplo a seguir, as classes Gato e Cachorro são subclasses concretas que estendem a superclasse abstrata Animal.
Arquivo Animal.java
public abstract class Animal {}
Arquivo Gato.java
public class Gato extends Animal {}
Arquivo Cachorro.java
public class Cachorro extends Animal {}
Em um relacionamento de herança, no qual haja superclasses abstratas com métodos abstratos, as suas subclasses concretas deverão, obrigatoriamente, implementar estes métodos abstratos.
É possível ter uma herança com várias classes abstratas, porém, a primeira classe concreta da hierarquia será obrigada a implementar todos os métodos abstratos definidos pelas suas superclasses.
Um Método Abstrato é um método NÃO implementado, ou seja, sem instruções, apenas com a sua assinatura definida.
Um método abstrato funciona como uma interface, isso é, permite a comunicação de um contrato entre a classe abstrata e as suas subclasses concretas.
A sintaxe em Java para criar um método abstrato é adicionar o modificador abstract após o modificador de acesso do método, em sua assinatura.
Além disso, a assinatura de métodos abstratos terminam com ponto e vírgula ; , uma vez que métodos abstratos não possuem corpo.
Um método abstrato será sempre público ou protegido.
Sintaxe:
modificadorDeAcesso abstract tipoRetorno nomeMetodo(lista_de_parâmetros);
No exemplo a seguir, as classes Gato e Cachorro são subclasses concretas que estendem a superclasse abstrata Animal e por isso devem implementar comportamentos para o método abstrato emitirSom().
Arquivo Animal.java
public abstract class Animal {
public abstract String emitirSom();
}
Arquivo Gato.java
public class Gato extends Animal {
public String emitirSom() {
return "Miau!";
}
}
Arquivo Cachorro.java
public class Cachorro extends Animal {
public String emitirSom() {
return "Au au!";
}
}
Implementar um método abstrato é igual a sobrescrever um método, basta definir um método com comportamento e que tenha a mesma assinatura do método original abstrato.
Arquivo Animal.java
public abstract class Animal {
private String nome;
public Animal(String nome) {
this.setNome(nome);
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public abstract String emitirSom();
}
Arquivo Main.java
class Main {
public static void main(String[] args) {
Animal cachorro = new Cachorro("Bidu");
Animal gato = new Gato("Mingau");
System.out.println(cachorro.getNome() + " faz " + cachorro.emitirSom());
System.out.println(gato.getNome() + " faz " + gato.emitirSom());
}
}
Arquivo Gato.java
public class Gato extends Animal {
public Gato(String nome) {
}
@Override
public String emitirSom() {
return "Miau!";
}
}
Arquivo Cachorro.java
public class Cachorro extends Animal {
public Cachorro(String nome) {
}
@Override
public String emitirSom() {
return "Au au!";
}
}
Nesse exemplo, a classe Animal é uma classe abstrata, ou seja, não pode ser instanciada diretamente, mas serve de base para outras classes que a estendem, como as classes Cachorro e Gato. A classe Animal possui um método abstrato emitirSom(), que deve ser implementado pelas subclasses Cachorro e Gato.
No método main() da classe Main, são criados objetos das classes Cachorro e Gato, que são tratados como objetos da superclasse Animal. Ao chamar o método emitirSom() em cada um desses objetos, o método correto é executado, de acordo com a implementação de cada uma das subclasses.