Worked example
class Dog extends Animal {
@Override
public String describe() { // same signature as Animal's describe()
return getName() + " is a dog";
}
}
Animal a = new Animal("Generic");
Dog d = new Dog("Rex");
System.out.println(a.describe()); // "Generic is an animal"
System.out.println(d.describe()); // "Rex is a dog" — Dog's version
Same method name, different result: the object's actual class decides which version runs.