Historicamente não há muito acordo sobre o que é exatamente Programação Orientada a Objetos (POO). E talvez nunca haja. O problema começa já pela tentativa de dizer o que é um "objeto". Mesmo este termo pode ser preterido por algo como "entidade".
Considere que estejamos numa casa. Nexte contexto em geral encontramos coisas como garfos, pratos, quartos, portas, etc. Numa perspectiva orientada a objetos, todas estas entidades são objetos. Fato similar acontece quando vamos a um estádio de futebol. Ali nos deparamos com objetos das mais variadas espécies, a exemplo de: bola, jogadores, juízes, bandeiras, lata de refrigerante, etc. Em realidade, a própria casa e o estádio de futebol podem também ser vistos como objetos.
Os exemplos acima são de contextos nos quais os objetos são reais (concretos). Estes objetos existem na realidade e podem, portanto, ser percebidos e distiguidos por nossos sentidos. Há
Um objeto é qualquer entidade que seja identificável e distinguível num certo domínio (contexto).
A conclusão é que nosso mundo é povoado por objetos.
Em geral a POO é caracterizada por um conjunto de abstrações que são freqüentemente encontradas sm suas diversas implementações. Dentre estas abstrações estão:
encapsulamento
ocultamento de informação/implementação
retenção de estado
identidade de objeto
mensagens
classes
herança
polimorfismo
genericidade