// Basic interface
interface Drawable {
    void draw(); // Implicitly public abstract
    
    // Default method (Java 8+)
    default void resize() {
        System.out.println("Resizing...");
    }
    
    // Static method (Java 8+)
    static void printInfo() {
        System.out.println("This is a Drawable interface");
    }
}

// Implementing interface
class Circle implements Drawable {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Rectangle implements Drawable {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
    
    // Override default method (optional)
    @Override
    public void resize() {
        System.out.println("Resizing rectangle specifically");
    }
}

// Multiple interfaces
interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

class Duck implements Drawable, Flyable, Swimmable {
    @Override
    public void draw() {
        System.out.println("Drawing a duck");
    }
    
    @Override
    public void fly() {
        System.out.println("Duck is flying");
    }
    
    @Override
    public void swim() {
        System.out.println("Duck is swimming");
    }
}

// Functional interface
@FunctionalInterface
interface Calculator {
    int calculate(int a, int b);
    
    // Can have default methods
    default void print(int result) {
        System.out.println("Result: " + result);
    }
}

// Usage
Drawable circle = new Circle();
circle.draw();
circle.resize(); // Uses default implementation
Drawable.printInfo(); // Static method call

// Polymorphism
Drawable[] shapes = {new Circle(), new Rectangle()};
for (Drawable shape : shapes) {
    shape.draw();
}

// Functional interface with lambda
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
int sum = add.calculate(5, 3);
int product = multiply.calculate(5, 3);