Olio on olio-ohjelmoinnissa tietokoneohjelman perusyksikkö, joka sisältää joukon loogisesti yhteenkuuluvaa tietoa (attribuutteja) ja toiminnallisuutta (jäsenfunktioita eli metodeja).[1] Oliot voivat kommunikoida keskenään lähettämällä viestejä tai kutsumalla toisen olioiden metodeja. Viestin vastaanottaminen suorittaa määritellyn toiminnon vastaanottavassa oliossa. Oliota käytetään ohjelmistosuunnittelussa esittämään jonkin abstraktin tai reaalimaailman käsitteen ilmentymää ohjelmistossa. Oliokielillä laaditut ohjelmat koostuvat tavallisesti lukuisista olioista, joiden yhteistyön tuloksena on ratkaisu ohjelmointiongelmaan.
Oliolla on määritelmä, josta käytetään nimeä luokka. Luokka määrittelee jonkun tietyn oliojoukon yhteiset piirteet. Olio luodaan laatimalla luokan ilmentymä eli instanssi, esimerkiksi varaamalla olion vaatima muisti. Esimerkiksi henkilörekisteriohjelmassa voidaan määritellä luokka Henkilö, joka määrittelee millaista tietoa henkilöistä halutaan esittää ja millä tavalla näitä tietoja voidaan käsitellä. Ohjelman ajon aikana luokasta Henkilö luodaan olioita esittämään yksittäisiä henkilöitä.
Oliokielissä oliot toteutetaan ajonaikaisina tietorakenteina, jotka sisältävät jäsenmuuttujat olion tiedon tallentamiseen. Olioiden toiminnallisuus määritellään useimmiten luokkien jäsenfunktioissa, jolloin kaikki saman luokan oliot sisältävät täsmälleen saman toiminnallisuuden tiedon käsittelyyn. Oliokieli osaa selvittää olion määrittelevän luokan, eli tyypin, ja siten käyttää oikeita jäsenfunktioita eri olioiden yhteydessä. Oikean jäsenfunktion löytämiseen on kaksi keinoa. Joko kääntäjä voi tehdä sen käännöksen yhteydessä, jolloin puhutaan staattisesta sidonnasta, tai se tapahtuu ajonaikana, jolloin kyseessä on dynaaminen sidonta.[2]
Yksi varhaisimmista oliokielistä, 1960-luvulla kehitetty Simula esitteli luokan, olion, perinnän ja dynaamisen sidonnan käsitteet. Toisen koulukunnan luoja on ollut Smalltalk. Näiden kahden suunnan ohjelmointikielissä käytetään toisistaan eriävää termistöä. Simulasta oliomallinsa lainanneessa C++:ssa kutsutaan luokan jäsenfunktioita, Smalltalkin jälkeläisissä kuten Objective-C:ssä niille lähetetään viestejä. Smalltalkiin perustuvissa kielissä käytetään dynaamista sidontaa, kun taas Simulaan perustuvissa kielissä suorituskykysyistä staattista silloin kun se on mahdollista.