java-tutorial

6) Inheritance & Polymorphism (and when not to use them)

Goal

Learn how inheritance works, how polymorphism enables flexible code, and why composition is often a better default.

Inheritance basics

class Animal {
    void speak() {
        System.out.println("...");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("woof");
    }
}

Polymorphism

Animal a = new Dog();
a.speak(); // woof

Your code can depend on the base type (Animal) and still work with any subclass.

When inheritance is risky

Inheritance can cause:

Prefer composition when possible: “has-a” over “is-a”.

Exercises

  1. Create Shape with subclasses Circle and Rectangle and a method area().
  2. Replace inheritance with composition in one example: create a Logger field used by another class.

Table of contents

  1. Getting Started: Install, run, and your first program
  2. Java Basics: types, variables, operators, formatting
  3. Control Flow: if/switch/loops
  4. Methods: parameters, return values, overloading
  5. OOP: classes, objects, encapsulation
  6. Inheritance & Polymorphism (and when not to use them)
  7. Interfaces, abstract classes, and design basics
  8. Exceptions and error handling
  9. Strings, files, and I/O basics
  10. Collections: List/Set/Map and Big-O intuition
  11. Generics (the useful parts)
  12. Lambdas & Streams
  13. Dates and time (java.time)
  14. Testing with JUnit 5 (basics)
  15. Concurrency: threads, executors, futures
  16. JVM basics: memory, GC, performance habits
  17. Build tools: Maven essentials (recommended)
  18. Next steps: projects to build