What are the core concepts of Object-Oriented Programming in Java, and how do they apply to writing clean, maintainable automation code?