Я не вижу простого ответа на второй вопрос (почему) здесь.Итак, давайте.
Допустим, у вас есть открытое поле, которое очень часто используется в вашем коде.Всякий раз, когда вы решите, что вам нужно сделать что-то дополнительное, прежде чем вы дадите или установите это поле, у вас возникнут проблемы.Вы должны создать специальный метод получения и установки для этого поля и изменить свой полный код с непосредственного использования поля на использование метода получения и установки.
А теперь представьте, что вы разрабатываете библиотеку, широко используемую многими людьми.Когда вам нужно внести изменения, подобные описанным выше, и установить прямой доступ к приватному полю, код всех людей, использующих это поле, прекратится.
Использование методов получения и установки имеет отношение к будущему планированию кода, поэтомуделает его более гибким.Конечно, вы можете использовать открытые поля, особенно для простых классов, которые просто содержат некоторые данные.Но всегда полезно сделать поле конфиденциальным и написать для него метод get и set.