What does this Java code demonstrate?
public abstract class Shape {
public abstract double area();
}
public class Circle extends Shape {
private double radius;
public Circle(double radius) { this.radius = radius; }
@Override
public double area() { return Math.PI * radius * radius; }
public static void main(String[] args) {
Shape shape = new Circle(2.0);
System.out.println(shape.area());
}
}