AnyCompiler

Abstract Classes

Uma abstract class pode declarar methods abstract, como methods de interface, sem corpo — mas diferente de uma interface, ela também pode conter fields reais e methods totalmente implementados, e uma subclass só precisa implementar as partes abstract. Vehicle não pode ser instanciada diretamente com new; só uma subclass concreta como Car, que fornece describe(), pode.

public class Main {
    static abstract class Vehicle {
        abstract String describe();

        void printDescription() {
            System.out.println(describe());
        }
    }

    static class Car extends Vehicle {
        String describe() {
            return "A car with four wheels";
        }
    }

    public static void main(String[] args) {
        Vehicle v = new Car();
        v.printDescription();
    }
}
Output
A car with four wheels

printDescription() é totalmente implementado no próprio Vehicle e herdado por Car sem mudanças, enquanto describe() tem que vir de qualquer subclass concreta que estenda Vehicle — abstract classes deixam você compartilhar código real junto com o contrato, algo que uma interface simples não pode fazer por você.

A seguir: exception handling — try, catch, checked exceptions, e como é um erro real de compilação por exception não reportada.

Practice exercise

Defina uma abstract class Shape com um method abstract area(). Defina uma class Square que estenda Shape com um field side e um method area() que retorne side * side. Crie um Square com side 5 e imprima seu area().