Message passing is how objects communicate in OOP - one object invokes another object's method. This indirect communication maintains encapsulation since objects don't directly access each other's internals. Message passing enables polymorphism and dynamic binding.