Innkapsling er en programmeringsteknikk som har som formål å hindre direkte tilgang til tilstanden til et objekt fra objekter av andre klasser. Motivasjonen er todelt: For det første er det viktig å sikre at tilstanden til alle objektene er gyldig. Dette gjøres best ved at alle endringer av tilstanden skjer ved å kalle objektets metoder, heller enn å endre på attributtene direkte. På denne måten slipper andre objekter å kjenne til alle reglene for gyldighet og konsistens, og koden blir mer robust ved at all logikk om attributter og regler samles i én klasse. For det andre er det viktig at koden for en klasse ikke er avhengig av detaljer i en annen, f.eks. eksakt hvilke attributter og datatyper som brukes for å representere data, fordi dette gjør endringer lettere å håndtere.
Ta som eksempel representasjon av fornavn og etternavn for en person. Dette kan gjøres med ett String-attributt, med fornavn og etternavn skilt med mellomrom, eller to separate String-attributter, ett for fornavn og ett for etternavn. Uansett hvilken konkret representasjon som velges, så handler det logisk sett om å håndtere to (uavhengige) verdier og det er ingen grunn til at detaljer om hvordan representasjonen gjøres skal være kjent for andre klasser. Istedet defineres operasjoner for både å lese og endre disse to verdiene og implementasjonene tar seg av detaljene. Dette er illustrert i følgende figur:
For det andre er det viktig at detaljer om hvordan data representeres med attributter kalle metoder Først og fremst gjøres dette ved å 1) definere regler for gyldighet for de ulike typene objekter og 2) sikre at alle metoder kodes i henhold til disse reglene. Dette er nøkkelen til programmeringsmetoden kalt innkapsling, som sammen med såkalte synlighetsmodifikatorer utgjør et vern mot ugyldig tilstander i programmer.
Formålet med innkapsling er hovedsaklig å sikre riktig bruk av et objekt