Зачем нужна инкапсуляция в ООП?
Да начнется холивар
Видел кучу разных, зачастую противоположных, мнений, но на мой взгляд - инкапсуляция не равно сокрытие (про которое вы и пишите, судя по типам полей).
Сокрытие является частным случаем инкапсуляции. В общем же случае инкапсуляция подразумевает объединение связанных элементов в один объект. Например есть юзер. У него есть разные свойства (логин-пароль/аватарка/id-шка). И если данные можно хранить в структурах (словари/массивы/списки и т.д,), то функции, описывающие взаимодействие с этим юзером просто так не сгруппируешь. Для этого и придумали инкапсуляцию и ООП.
Сокрытие же в этом случае может применяться например для создания "точки входа" при работе с паролем для защиты от "дураков"/предварительной обработки/проверки данных.
Делаем поле private и все, "тупо изменить" его извне уже нельзя. Для его изменения мы предоставляем метод, который перед тем как изменить его (условно):

Валидирует значения по заданным критериям
Проверяет наличие прав на изменение пароля

UPD. 
но кто сможет потом их поменять, если я не добавлю функцию для изменения?
Ну, видимо никто. Если не добавите советующую функцию.
Какая разница, private я установил или public, функции для изменения не будет у программы и никто и никак не сможет поменять этот URL. 
Ну, в этом смысла нет, но можно упомянуть какие-то внутренние вещи. Например сессии юзера. Извне методы работы с ними в таком классе не доступны в принципе, для безопасности. Но внутри класса к ним есть доступ у других медодов.
Если вы не понимаете инкапсуляцию, значит вам это и не нужно. Когда получите больше опыта в программировании, вспомните про инкапсуляцию как про спасательный круг.

Зачем нужна инкапсуляция? Чтобы абстрагироваться от деталей реализации. Например, если у вас есть сетевой пакет данных (который передаётся по IP), то вам нет смысла разбирать, что там передаётся внутри (например, заголовки http запроса), а вы просто инкапсулируете это всё дело как payload (полезные данные пакета) и дальше уже работаете с конкретно IP составляющей пакета (src, dst, payload ,checksum,...). 

Другой пример: автомобиль. Когда вы хотите поехать, вы нажимаете несколько кнопок, рычагов, ключ поворачиваете. Согласитесь, что вам не интересно знать напряжение на двигателе во время поездки. Ещё более неудобным было бы видеть огромную приборную панель как в самолёте, когда вы хотите просто нажать на газ и поворачивать руль. 

Иными словами, когда вы работаете с классом, некоторые его члены вы не хотите видеть, чтобы не допустить ошибку во внешнем когде. Также иногда полезно абстрагироваться (generic, шаблоны, наследование, полиморфизм, макросы, метаклассы) для экономии сил и времени (переиспользование кода).

p.s.
Думаю, вам надо уточнить значение термина инкапсуляция.