Polymorphism Strong understanding of polymorphism:
- understand downcasting and upcasting, and when to use them advisedly
- deep understanding of overriding (with class members, using any access specifier...)
- identify constructor invocation sequence in a complex class hierarchy
- know what late (or dynamic) binding is, and how it works
- describe what field hiding is
Know and understand the following basic OO design principles:
- Liskov Substitution Principle
- High Cohesion - Low Coupling
- Open/Closed Principle
- Composite Reuse Principle
- Acyclic Dependencies Principle
Be able to recognize cases where they are respected or not, and recognize a principle from a definition.
Design PatternsKnow and understand the following Design Patterns:
- Singleton
- Factory
- Template Method
- Observer
- Decorator
- Proxy
- Facade
- Composite
Know their intent, a way to implement them in Java.
Be able to recognize them from a definition or from a code example.
- encapsulation
- responsibility-driven design
- immutability
- static vs regular method/attribute
- this and super meaning/usage
- multiple inheritance (and related problems, like common ancestor constructed twice)
- interface
- abstract class and method