This course teaches concepts and methods of object-oriented programming as well as concurrent programming techniques. The object-oriented programming features of Java are presented in detail, focusing on the proper use of polymorphism. The course also teaches design by contract, UML, as well as selected design principles and patterns. Moreover, the course gives an introduction to concurrent programming in Java. It covers multi-threading, safety and liveness hazards, and synchronization. The presented techniques enable the development of scalable Java software capable of exploiting modern multicore hardware.