📔 6.1 Qual o tipo de cada Livro?

🎯 Objetivo

Compreender o papel das Classes Abstratas na modelagem de sistemas, aprendendo a impedir a criação de instâncias de conceitos puramente teóricos (como um “Livro” genérico) e forçando o uso de tipos concretos (Ebook, LivroFisico).

🏗️ O Conceito: Classes Abstratas

Em nossa livraria, um Livro serve como base para atributos comuns (nome, valor, autor). No entanto, não faz sentido vender um “Livro” que não seja físico nem digital.

Ao marcar uma classe com o modificador abstract, impedimos que ela seja instanciada via new, garantindo que apenas suas subclasses (filhas) sejam comercializadas.

💻 Mão na Massa

Passo 1: Tornando a Classe Abstrata

Utilizamos a palavra-chave abstract na assinatura da classe:

public abstract class Livro {
    private String nome;
    private double valor;
    
    // Construtores, Getters e Setters continuam aqui
}

Passo 2: O Impacto no Código

Tentar criar um livro genérico resultará em erro de compilação:

// ❌ ERRO: Cannot instantiate the type Livro
Livro livro = new Livro(autor); 

O código deve agora utilizar os tipos concretos:

public class CadastroDeLivros {
    public static void main(String[] args) {
        // ✅ CORRETO: Criando um tipo específico que herda de Livro
        Livro livro = new LivroFisico(autor);
        livro.setNome("Java 17 Prático");
        livro.setValor(59.90);
        
        System.out.println("Livro cadastrado com sucesso!");
    }
}

✅ Resultado Esperado

O compilador Java garantirá a integridade do domínio, impedindo a existência de objetos “incompletos” e forçando o desenvolvedor a escolher uma especialização do livro.

Herança e Polimorfismo 🛡️

Mesmo que você não possa dar new em Livro, ele continua sendo uma referência válida. O método carrinho.adiciona(Livro livro) aceitará tanto um Ebook quanto um LivroFisico graças ao polimorfismo.

🚨 Erros Comuns

ErroCausaSolução
Cannot instantiate typeTentativa de usar new em classe abstrata.Mude para new Subclasse().
Perda de métodos no objetoEsquecer de declarar métodos abstratos na classe pai.Se o pai não tem o método, você não o acessa via referência Livro.

🔗 Próximo Capítulo

Agora que você domina abstrações, vamos ver como criar Métodos Abstratos.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️