Abstract Classes
Una abstract class puede declarar methods abstract, como los methods de una interface, sin cuerpo — pero a diferencia de una interface, también puede contener fields reales y methods completamente implementados, y una subclass solo tiene que implementar las partes abstract. Vehicle no puede instanciarse directamente con new; solo una subclass concreta como Car, que provee describe(), puede.
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();
}
}A car with four wheels
printDescription() está completamente implementado en Vehicle mismo y se hereda en Car sin cambios, mientras que describe() tiene que venir de cualquier subclass concreta que extienda Vehicle — las abstract classes te permiten compartir código real junto con el contrato, algo que una interface simple no puede hacer por ti.
Siguiente: exception handling — try, catch, checked exceptions, y cómo se ve un error real de compilación por excepción no reportada.
Practice exercise
Define una abstract class Shape con un method abstract area(). Define una class Square que extienda Shape con un field side y un method area() que devuelva side * side. Crea un Square con side 5 e imprime su area().