Encapsular é empacotar dados e operações, de modo que toda a obtenção e modificação desses dados sejam feitas pelas operações.
No exemplo do fogão, vamos considerar um objeto “Botijão de Gás”. Esse objeto foi definido com a responsabilidade “fornecer gás”. Essa responsabilidade foi convertida em uma operação da classe “BotijãoDeGás” chamada “FornecerGás()”.
Então...o que é necessário um botijão de gás ter para conseguir fornecer gás? Ué!?! Simplesmente gás! Pois então! Um objeto botijão de gás deve ter um dado que descreveria a quantidade de gás que ele possui. A partir dessa quantidade, ele poderia “FornecerGás()” se pudesse e quando isso ocorresse ele mesmo cuidaria de reduzir a sua quantidade de gás. Isso é encapsular!
Um botijão de gás tem um atributo “quantidadeDeGás”. Esse atributo está encapsulado, pois somente a operação “FornecerGás()” age sobre ele. Isso gera uma das maiores vantagens da programação OO sobre a programação tradicional, pois é incomparavelmente mais simples garantir a integridade dos dados, visto que somente as operações da classe do objeto manipulam os dados do objeto.
Mas se um botijão de gás vai fornecendo gás, uma hora o gás acaba. Se eu não posso modificar a quantidade de gás, como faço para “reabastecê-lo”? Nesse caso você deve definir uma nova responsabilidade para o próprio botijão que seria “reabastecer”.