W programowaniu obiektowym (OOP) klasa zagnieżdżona to klasa, która jest całkowicie zawarta w innej klasie. Różnorodne języki komputerowe obsługują tę strukturę obiektową, w tym C++ i język programowania Java. Jeśli klasa zagnieżdżona nie jest zadeklarowana jako statyczna, może być również nazywana klasą wewnętrzną. Klasa może zawierać dowolną liczbę klas wewnętrznych, a każda klasa wewnętrzna może również zawierać własne klasy wewnętrzne. Klasy zagnieżdżone mogą być bardzo przydatne, ale mogą również szybko skomplikować struktury klas, dlatego najlepiej jest używać ich w ramach starannego planu, aby nie stały się niepotrzebnie skomplikowane.
Klasa zagnieżdżona jest często pomocna w hermetyzowaniu małych grup funkcji lub zmiennych, które są przydatne dla innej określonej klasy. Na przykład, jeśli klasa A zawiera grupę metod, których tylko ona używa, metody te można zgrupować w klasie wewnętrznej B. Metody wewnątrz klasy wewnętrznej mają dostęp do zmiennych i metod klasy zewnętrznej, zachowując jednocześnie własne zmienne lub stałe w razie potrzeby. Klasa zagnieżdżona może być używana jako konstrukcja funkcjonalna lub organizacyjna; chociaż jest to przydatne do enkapsulacji funkcjonalności, jest równie przydatne jako narzędzie organizacyjne. Idealne użycie klas wewnętrznych zarówno zgrupuje powiązane funkcjonalności, jak i zorganizuje kod w celu łatwiejszej czytelności i zrozumienia.
Komentowanie powinno być wykonywane w klasie zagnieżdżonej, tak samo jak w klasie zewnętrznej; początkującym łatwo jest pomylić klasy wewnętrzne z metodami i zapomnieć o tym. Komentując klasę zagnieżdżoną, najlepiej jest traktować ją jako klasę najwyższego poziomu i odpowiednio ją skomentować. Komentarze do klasy wewnętrznej dają również programiście możliwość wyjaśnienia funkcjonalności klasy wewnętrznej i uzasadnienia jej schematu organizacyjnego. W jednej klasie zewnętrznej może istnieć wiele klas wewnętrznych, dlatego szczególnie ważne jest, aby programista wyraźnie skomentował każdą z nich.
Jeśli klasa zagnieżdżona nie jest zadeklarowana jako statyczna, wystąpienie klasy zewnętrznej musi zostać jawnie utworzone przed utworzeniem wystąpienia klasy wewnętrznej. W przypadku klas wewnętrznych, które są zadeklarowane jako statyczne, nie jest to prawdą. Statyczną klasę zagnieżdżoną zwykle można utworzyć za pomocą mniejszej liczby naciśnięć klawiszy i może ona mieć szerszy zakres niż prosta klasa wewnętrzna, więc statyczne klasy zagnieżdżone są przydatne do tworzenia łatwo dostępnych metod narzędziowych, takich jak fabryki lub proste samodzielne metody z szerokimi aplikacjami.
Często jest to pomocne dla programistów, gdy klasy zagnieżdżone są opisywane za pomocą Unified Modeling Language. Zunifikowany język modelowania adnotuje i ilustruje strukturę i zachowanie klas w jednoznaczny sposób, często za pomocą diagramów. Klasy zagnieżdżone otrzymują niezależne opisy od klas zewnętrznych, w których się znajdują, dzięki czemu bardzo łatwo jest zidentyfikować i przeanalizować ich funkcjonalność. Chociaż nie jest wymagane, aby klasa zagnieżdżona była opisana w ten sposób, często lepiej jest, aby programiści błądzili po stronie większej ilości szczegółów.