Dynamic Execution
Java’s architecture allows you to write programs that dynamically extend themselves at run-time.
Java programs can choose at run-time which types (classes and interfaces) to load and use.
You don’t necessarily need to know about the types your program will use.
Some of those classes may not even exist when you compile your project.