Fundamentals of OOP and Data Structures in Java