The runtime object type decides which overridden instance method runs.
When a subclass overrides a method, Java chooses the implementation at runtime based on the real object. That is why `Product item = new DigitalProduct()` still runs the `DigitalProduct` override.