Interfaces et classes abstraites
import java.awt.geom.Point2D;

abstract class Shape {
	public Point2D center;
	abstract double getSurface();
	public String toString() {
		return "I am a shape";
	}
}

class Circle extends Shape{
	public double radius;
	
	double getSurface() {
		return Math.pow(radius, 2) * Math.PI;
	}
	
}

class Rectangle extends Shape {
	public double width, height;

	Rectangle(double a, double b) {
		width = a;
		height = b;
	}

	@Override
	double getSurface() {
		return width * height;
	}
}

class Triangle extends Shape {
	double basis, height;

	Triangle(double a, double b) {
		basis = a;
		height = b;
	}

	double getSurface() {
		return basis * height / 2.0;
	}
}

public class ShapeDemo {

	public static void main(String[] args) {
		Rectangle s1 = new Rectangle(4, 5);
		Triangle s2 = new Triangle(3, 2);
		
		Shape[] shapes = new Shape[10];
		shapes[0] = new Rectangle(4, 5);
		shapes[1] = new Triangle(4, 12);
		System.out.println(shapes[0].getSurface());
		System.out.println(shapes[1].getSurface());
	}
}