Il corso si propone di raffinare le capacità di programmare nel linguaggio Java apprese nel corso di Programmazione I e di introdurre le nozioni fondamentali della programmazione orientata agli oggetti. In particolare, il corso illustrerà le astrazioni fondamentali per la progettazione del software (classi e oggetti), la definizione di semplici strutture dati e operazioni corrispondenti (liste, alberi, pile, code), i meccanismi di base per favorire riuso e modularità del software (ereditarietà, polimorfismo, tipi generici), la specifica degli invarianti di classe e gestione delle loro violazioni (eccezioni), così come alcune classi fondamentali della libreria Java. Si darà particolare enfasi agli aspetti di buona progettazione del software, utilizzando concetti presi a prestito dall'ingegneria del software e formalismi grafici quali UML.