Object georienteerd programmeren houd in dat je moet denken in termen van objecten en operaties tussen op objecten. In Java (en een aantal andere talen) wordt een object beschreven door een class. Een class duidt aan welke data een object kan bevatten en welke operaties erop mogelijk zijn. Een class kan dan meerdere keren geinstantieerd worden. Deze instanties zijn dan de feitelijke objecten.
Data en operaties kunnen toegankelijk zijn voor iedereen, enkel van binnen het object (of objecten van dezelfde klasse) of enkel van binnen de class en childclasses (zie later). Dit wordt aangeduid met de keywords public, private of protected.
Nieuwe objecten worden aangemaakt door het keyword new te gebruiken. Een constructor definieert wat er moet gebeuren als een object van een bepaalde klasse wordt aangemaakt. Een constructor is een method die dezelfde naam heeft als de bijhorende klasse maar niets returned. Een constructor kan overloaded worden.
In de Demo1 van Bottles heeft een persoon een aantal bottles (maximum 5). Een persoon heeft daarnaast ook een naam. Een bottle heeft een capaciteit, inhoud, een beschrijving van de inhoud en is open of gesloten.Een persoon kan een Bottle bijmaken, verwijderen, van een Bottle drinken eeen Bottle delen met een andere persoon, een Bottle weggeven aan een andere persoon en zijn collectie printen.
Demo2 gaat verder op Demo1. Er is hier echter een extensie van Bottle bijgemaakt: een GrandCuvee. Deze stelt een fles uit een "Grand Cuvee" voor. Dit is nog steeds een Bottle, maar deze zal steeds 750ml capaciteit hebben. Daarnaast heeft elke GrandCuvee een uniek serienummer en is deze van een Chateau. Person is gewijzigd om naast een Bottle ook een GrandCuvee te kunnen bijmaken.
Download hier de code van de demo2
In de derde variant is de Bottle een abstracte class met een abstracte method (namelijk drop()). drop() is enkel gedeclareerd voor Bottle, maar niet geimplementeerd. Dit houdt ook in dat alle BottleObjecten instanties van een subklasse moeten zijn (in dit geval PlasticBottle, GlassBottle of GrandCuvee). De GrandCuvee is hier gewijzigd om altijd een glazen fles te zijn. Merk op dat er een static variable gebruikt wordt om het serienummer te genereren.