Interfaces in Java

*Interfaces* are named collections of method signatures.

```java
import java.lang.Math;

// Here's a basic interface for geometric shapes.
interface Geometry {
    double area();
    double perim();
}

// For our example we'll implement this interface on
// Rectangle and Circle classes.
class Rectangle implements Geometry {
    double width, height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // To implement an interface in Java, we need to
    // implement all the methods in the interface.
    @Override
    public double area() {
        return width * height;
    }

    @Override
    public double perim() {
        return 2 * width + 2 * height;
    }

    @Override
    public String toString() {
        return "Rectangle{width=" + width + ", height=" + height + "}";
    }
}

class Circle implements Geometry {
    double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    // The implementation for Circle.
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    @Override
    public double perim() {
        return 2 * Math.PI * radius;
    }

    @Override
    public String toString() {
        return "Circle{radius=" + radius + "}";
    }
}

public class Interfaces {
    // If a variable has an interface type, then we can call
    // methods that are in the named interface. Here's a
    // generic measure method taking advantage of this
    // to work on any Geometry.
    public static void measure(Geometry g) {
        System.out.println(g);
        System.out.println(g.area());
        System.out.println(g.perim());
    }

    public static void main(String[] args) {
        Rectangle r = new Rectangle(3, 4);
        Circle c = new Circle(5);

        // The Circle and Rectangle classes both
        // implement the Geometry interface so we can use
        // instances of these classes as arguments to measure.
        measure(r);
        measure(c);
    }
}

To run the program, compile it and then use java to execute:

$ javac Interfaces.java
$ java Interfaces
Rectangle{width=3.0, height=4.0}
12.0
14.0
Circle{radius=5.0}
78.53981633974483
31.41592653589793

In Java, interfaces are similar to those in other languages. They define a contract that classes must adhere to. Any class that implements an interface must provide implementations for all the methods declared in the interface.

The @Override annotation is used to indicate that a method in a subclass is intended to override a method in its superclass or implement a method from an interface. While not strictly necessary, it’s a good practice as it helps catch errors at compile-time.

Java uses the implements keyword to declare that a class implements an interface, unlike some other languages that might use different syntax or implicit interface implementation.

To learn more about Java’s interfaces, you might want to check out the official Java documentation or other comprehensive Java resources.