Em C++, se uma classe tem pelo menos uma função virtual pura, a classe se torna abstrata. Ao contrário de C++, em Java, um resumo de palavra-chave separado é usado para fazer um resumo de classe. 

// An example abstract class in Java
abstract class Shape {
    int color;
  
    // An abstract function (like a pure virtual function in
    // C++)
    abstract void draw();
}

A seguir estão algumas observações importantes sobre classes abstratas em Java.

1) Como C++, em Java, uma instância de uma classe abstrata não pode ser criada, podemos ter referências ao tipo de classe abstrata. 

abstract class Base {
    abstract void fun();
}
class Derived extends Base {
    void fun()
    {
        System.out.println("Derived fun() called");
    }
}
class Main {
    public static void main(String args[])
    {
  
        // Uncommenting the following line will cause
        // compiler error as the line tries to create an
        // instance of abstract class. Base b = new Base();
  
        // We can have references of Base type.
        Base b = new Derived();
        b.fun();
    }
}
Saída
Diversão derivada() chamada

2) Como C++, uma classe abstrata pode conter construtores em Java. E um construtor de classe abstrata é chamado quando uma instância de uma classe herdada é criada. Por exemplo, o seguinte é um programa Java válido. 

// An abstract class with constructor
abstract class Base {
    Base()
    {
        System.out.println("Base Constructor Called");
    }
    abstract void fun();
}
class Derived extends Base {
    Derived()
    {
        System.out.println("Derived Constructor Called");
    }
    void fun()
    {
        System.out.println("Derived fun() called");
    }
}
class Main {
    public static void main(String args[])
    {
        Derived d = new Derived();
    }
}
Saída
Construtor de base chamado
Construtor derivado chamado

3) Em Java, podemos ter uma classe abstrata sem nenhum método abstrato. Isso nos permite criar classes que não podem ser instanciadas, mas apenas herdadas. 

// An abstract class without any abstract method
abstract class Base {
    void fun() { System.out.println("Base fun() called"); }
}
  
class Derived extends Base {
}
  
class Main {
    public static void main(String args[])
    {
        Derived d = new Derived();
        d.fun();
    }
}
Saída
Fun base() chamado

4) As classes abstratas também podem ter métodos finais (métodos que não podem ser substituídos). Por exemplo, o programa a seguir é compilado e executado corretamente. 

// An abstract class with a final method
abstract class Base {
    final void fun()
    {
        System.out.println("Derived fun() called");
    }
}
  
class Derived extends Base {
}
  
class Main {
    public static void main(String args[])
    {
        Base b = new Derived();
        b.fun();
    }
}
Saída
Diversão derivada() chamada

5) Para qualquer classe java abstrata, não temos permissão para criar um objeto, ou seja, para a instanciação de uma classe abstrata não é possível. 

// An abstract class example
abstract class Test {
    public static void main(String args[])
    {
        // Try to create an object
        Test t = new Test();
    }
}

Saída:

Compile time error. Test is abstract; 
cannot be instantiated Test t=new Test();

6) Semelhante à interface, podemos definir métodos estáticos em uma classe abstrata que pode ser chamada independentemente sem um objeto. 

abstract class Party {
    static void doParty()
    {
        System.out.println("Lets have some fun!!");
    }
}
  
public class Main extends Party {
    public static void main(String[] args)
    {
        Party.doParty();
    }
}
Saída
Vamos nos divertir!!

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="374" src="https://www.youtube.com/embed/DWmpxZ59JW0?feature=oembed" width="665"></iframe>

Exercício:  
1. É possível criar uma classe abstrata e final em Java? 
2. É possível ter um método abstrato em uma aula final? 
3. É possível herdar de várias classes abstratas em Java?

Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.