Obiekty są instancjami klas. Klasa może określać stan obiektu za pomocą pól oraz jego zachowanie za pomocą metod. Język obsługuje m.in. enkapsulację, polimorfizm, klasy abstrakcyjne i interfejsy.

Wszystkie klasy, z wyjątkiem Object, mają bezpośrednią klasę nadrzędną. Java nie umożliwia wielokrotnego dziedziczenia klas, natomiast jedna klasa może implementować wiele interfejsów. Od Java 8 interfejsy mogą zawierać również metody domyślne posiadające implementację.

Wszystkie zwykłe klasy dziedziczą ostatecznie po klasie java.lang.Object, która definiuje podstawowe operacje dostępne dla obiektów, m.in. equals(), hashCode(), toString() i getClass().

W kolejnych wersjach Javy model typów rozszerzano m.in. o klasy rekordowe (records), przeznaczone przede wszystkim do reprezentowania agregatów danych, oraz klasy i interfejsy zapieczętowane (sealed), pozwalające ograniczyć zbiór klas, które mogą po nich dziedziczyć. Rekordy stały się stałą częścią języka w Java 16, a klasy zapieczętowane w Java 17.

Typy generyczne

Java obsługuje typy generyczne, umożliwiające definiowanie klas, interfejsów i metod parametryzowanych typem. Mechanizm ten pozwala m.in.