The course is primarily motivated by the need for powerful abstraction techniques that facilitate the development and maintenance of large programs. After a brief introduction to the basics of the Java language, the course the abstraction techniques are successively introduced, each being the subject of a chapter: procedural abstraction (reminder), data abstraction, iteration abstraction and type hierarchy abstraction. Additional chapters are dedicated to exceptions, generics and testing. In each chapter, concepts are illustrated and implemented with the Java language. The course is based on the book: “Program Development in Java: Abstraction, Specification and Object-Oriented Design” by Barbara Liskov & John Guttag, Addison-Wesley