Очень красивое слово — инкапсуляция. Честно сказать, я не очень люблю красивые слова, по которым сложно понять, что именно они означают. И несмотря на то что на первых порах вы не очень много внимания будете уделять структуре и качеству объектов, я постараюсь убедить вас в том, что эта тема очень важна.
Инкапсуляция — это свойство, благодаря которому разработчику, использующему определенный строительный блок (код), не нужно знать, как он на самом деле реализован и работает для корректного использования этого строительного блока. Что это значит? Когда вы садитесь за руль автомобиля, вы знаете, как устроен его двигатель или коробка передач? Лично я понятия не имею. Нет, я в курсе, что двигатель ворочает коробку передач, а та передает свои усилия на колеса, и этого мне вполне достаточно, чтобы повернуть ключ, воткнуть первую передачу и начать движение.
Программисту, использующему ваш класс, не обязательно знать, как он реализует необходимые возможности. Я бы сказал больше, ему абсолютно не нужно даже знать ничего лишнего. Разрабатывая класс, вы должны проектировать его таким образом, чтобы все методы и свойства, выполняющие основную работу, были закрыты.
Разрабатывая классы, вы можете объявлять его методы и свойства с различными правами доступа. Забегая вперед, скажу, что их немного: public, private, protected и published. Что имеется в виду под доступом? Открытые методы и классы видны другим классам.
Если я пишу программу и хочу добавить возможность шифрования, то я создаю экземпляр класса шифрования и смогу получить доступ только к ее открытым методам и свойствам. Мне абсолютно не важно, как класс шифрует, какой там алгоритм и т. д. Для меня важно, чтобы он делал это качественно и надежно. Еще мне важно иметь возможность указать ключ и текст, с помощью которых будет происходить шифрование, и возможность получить результат. Именно эти три возможности обязательно должны быть открыты, а все остальное должно быть сокрыто от моих глаз и воздействия, чтобы я не смог испортить работу класса.
Сразу же дам совет — никогда не делайте открытыми переменные класса. Они должны быть закрыты, а если нужно иметь возможность воздействия на переменные, то для этого лучше использовать методы или свойства (property). То есть для чтения и для изменения переменной должны использоваться только методы, без возможности прямого воздействия.
Мы уже научились программировать теоретически и можем словами описать всю логику программы и даже такую на первый взгляд довольно сложную вещь, как логику объектов. Теперь предстоит перейти к практике и увидеть все это на реальных программах.