JaJava · Lesson 6 of 9

Classes & OOP

Java is fully committed to OOP. Everything is a class. Even the Hello World program. Embrace it.

Java
// Abstract class
public abstract class Animal {
    private String name;  // private — encapsulation

    public Animal(String name) { this.name = name; }

    public String getName() { return name; }  // getter

    public abstract String speak();  // subclasses must implement

    public String describe() {  // can be overridden
        return name + " says " + speak();
    }
}

// Interface
public interface Trainable {
    void learn(String trick);
    List<String> getTricks();

    default String showTricks() {  // default implementation (Java 8+)
        return String.join(", ", getTricks());
    }
}

// Concrete class
public class Dog extends Animal implements Trainable {
    private List<String> tricks = new ArrayList<>();

    public Dog(String name) { super(name); }

    @Override
    public String speak() { return "Woof!"; }

    @Override
    public void learn(String trick) { tricks.add(trick); }

    @Override
    public List<String> getTricks() { return tricks; }

    @Override
    public String describe() {
        return super.describe() + " (knows " + tricks.size() + " tricks)";
    }
}

// Java 16+ records — immutable data classes
record Point(double x, double y) {
    // Compact constructor for validation
    Point {
        if (Double.isNaN(x) || Double.isNaN(y))
            throw new IllegalArgumentException("Coordinates cannot be NaN");
    }

    public double distance() {
        return Math.sqrt(x * x + y * y);
    }
}
Java
// Generics
public class Pair<A, B> {
    private final A first;
    private final B second;

    public Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() { return first; }
    public B getSecond() { return second; }

    @Override
    public String toString() {
        return "(" + first + ", " + second + ")";
    }
}

// Generic method
public static <T extends Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) >= 0 ? a : b;
}

// Main usage
public static void main(String[] args) {
    Dog dog = new Dog("Rex");
    dog.learn("sit");
    dog.learn("shake");
    System.out.println(dog.describe());
    System.out.println(dog.showTricks());

    Point p = new Point(3, 4);
    System.out.println("Distance: " + p.distance());

    Pair<String, Integer> pair = new Pair<>("Alice", 30);
    System.out.println(pair);

    System.out.println(max("apple", "banana"));   // banana
    System.out.println(max(42, 17));               // 42
}