Java: Abstraction & Design