Инкапсуляция против скрытия данных-Java
Корр.: что такое инкапсуляция и как ее достичь на Java?
Я: инкапсуляция-это механизм для скрытия информации от клиента. Информация может быть данными или реализацией или алгоритмом. Мы добиться этого с помощью модификаторов доступа.
Корр.: это скрытие данных. Как мы достигаем инкапсуляции в Java?
меня: uummmm
Конкретный Вопрос: кроме "модификаторов доступа", каков способ реализации инкапсуляции в Java?
18 ответов
в целом инкапсуляция относится просто к объединению данных (например, объекта) с операциями над этими данными. Таким образом, у вас есть класс, инкапсулирующий данные - поля вместе с методы для управления этими данными.
но инкапсуляция также иногда используется так же, как и ваш ответ, и действительно, один из пунктов объединения данных и методов -скрыть реализация.
I предположим, что ответ лучше, чем просто используйте методы и сделайте все поля частными is: используйте интерфейсы. Таким образом, операции над объектом основаны исключительно на контракте интерфейса и никоим образом не привязаны к полям или вспомогательным методам, используемым для внутренней реализации этого контракта.
инкапсуляция
В общем инкапсуляция означает связывать похожие товары, просто.
например,Student
класс, в котором у нас будут переменные экземпляра students и поведение / методы, действующие на эти переменные экземпляра @ one place.
почему это важно? Мы не хотим, чтобы наш код был разбросан по всей базе.
если скажем, что нам нужно внести изменения, нам нужно найти варианты(из этих изменений) во всех местах. Связывая подобные элементы, мы просто избегаем таких сценариев, и это также помогает сделать наш связанный код более сфокусированным.
Сокрытие Данных
Он просто предоставляет способ защитить ваши данные от внешнего мира. Это означает, что, скажем, если я сделал переменную экземпляра общедоступной, то любой может изменить ее состояние. Но если мы сделаем нашу переменную экземпляра частной / защищенной, то на самом деле мы ограничиваем внешние сущности от внесения изменений в он.
Сравнение/Обсуждение
теперь возникает вопрос, в каком отношении мы делаем наши переменные защищены?
снова нам нужно понять, что инкапсуляция как раз контейнер нам нужно установить наши подобные детали.
его просто действовать как черный ящик к внешнему миру. Внешний мир (я имею в виду клиентов/потребителей: используя наш Student
class) не знаю внутренних деталей / деталей реализации Student
class и на самом деле они не должны заботиться о внутренних деталях/деталях реализации класса. Им просто нужны некоторые методы / API, чтобы они могли использовать их в своем клиентском приложении.
таким образом, моя точка зрения заключается в том, что все связанные со студентами поведения / переменные помещаются в черный ящик который мы называем классом. Теперь его до дизайнера класса, какие элементы класса должны быть скрыты и что не должно быть скрыто извне мир.
теперь вернемся к вопросу в Java: мы делаем наши переменные частными, это означает, что они защищены классом.Если мы хотим, чтобы наши переменные экземпляра были доступны во всем пакете, они защищены пакетом. Через проект они являются публичными. Поэтому я хочу сказать, что для скрытия данных вам нужен какой-то контейнер, куда вы поместите свои данные и спрячете их относительно контейнера.
так что я чувствую Сокрытие Данных невозможно без инкапсуляция. Вы не можете скрыть свои данные, не помещая их в какой-либо контейнер. Опять же, я напоминаю вам, что я помещаю это в контекст объектно-ориентированного языка.
а да инкапсуляция возможно без сокрытия ваших данных. Поместите все вещи публично, и вы можете увидеть аффект.
инкапсуляция: возьмите пример капсулы. Если вы откроете его, в нем будет много ингредиентов. Инкапсуляция объектно-ориентированного программирования также похожа на это. Как следует из названия"инкапсуляция означает инкапсуляцию (создание капсулы) всех элементов данных, атрибутов и соответствующих методов в одной капсуле.
Как вы это делаете: допустим, вы сделали класс под названием "Автомобиль". Теперь автомобиль имеет цвет цена и модель. Это атрибуты, и у него есть метод run. Итак, здесь вы инкапсулировали все эти атрибуты и методы транспортного средства с именем "автомобиль". Когда вы создаете экземпляр автомобиля, как so
Car myCar = new Car();
вы можете получить доступ ко всем атрибутам Car с помощью переменной myCar.
"сокрытие данных": скрытие данных контролируется в Java с помощью модификаторов доступа. Для доступа к элементам данных вы используете аксессоры while для изменения используемых данных "мутаторы". Java не предоставляет аксессоры и мутаторы сами по себе, вы создаете их сами (геттеры и сеттеры). В то время как C# предоставляет свойства для этого.
Я ненавижу это делать, но, от Википедия:
в языках программирования инкапсуляция используется для ссылки на один из двух родственные, но различные понятия, а иногда и сочетание из них:
- языковой механизм ограничения доступа к некоторым компонентам объекта.
- языковая конструкция, которая облегчает связывание данных с методами (или другими функциями), работающими с этими данными
ваше объяснение было больше похоже на первое понятие, интервьюер искал что-то на втором.
инкапсуляция данных относится к механизму сохранение всех связанных свойств и метода в одном объекте.
пример: Автомобиль. Он держит рулевые колеса, шины, двигатель и все связанные вещества в одну коллективную сущность, известную как Car
.
языки программирования инкапсуляция достигается с классы. Класс содержит все свойства и методы, связанные в one single entity
это предназначено для выполнения конкретной задачи.
сокрытие данных относится к скрытие незначительных деталей от пользователя и показать ему только соответствующие данные.
пример: когда мы нажимаем тормоза или акселератор в машине, мы не знаем, что происходит за сценой (как его увеличивает скорость или как его применение тормозов в шины). Все, что мы знаем, это то, что у нас есть тормоз и ускоритель для выполнения желаемого результата.
в программировании это делается с помощью модификаторы доступа. частная члены не работает из-за пределов класса и только public
члены доступны для пользователей. Частные члены могут быть доступны только из члены класса обеспечение безопасность для частных членов, которые будут непосредственно оцениваться извне класса.
вопрос кажется вводящим в заблуждение, я сомневаюсь, что кто-либо, кроме интервьюера, может ответить на него, и есть вероятность, что его/ее ответ может быть неправильным. Самое главное, неясно, что вопрос должен оценивать или открывать.
тем не менее, я подумал об этом, и следующее, что я считаю, может быть моей попыткой ответить на вопрос.
С Модификаторами Доступа
в Java инкапсуляция реализуется путем скрытия деталей с помощью модификаторы доступности (т. е. общедоступные, защищенные, частные и т. д.). С помощью этих уровней доступности Вы контролируете уровень скрытия информации. Чем менее ограничительный уровень, тем более дорогостоящим является изменение, когда это происходит, и тем более связан класс с другими зависимыми классами (т. е. пользовательскими классами, подклассами).
очевидно, инкапсуляция-это больше, чем просто скрытие состояния. В Java вы можете скрыть целые классы и интерфейсы и их состояние и поведение, скрывая детали реализации всего API.
например, метод Arrays.asList()
возвращает List
реализация, но нам все равно, какая реализация, если она удовлетворяет List
общий интерфейс, верно?. Реализация может быть изменена в будущем, не затрагивая нас, пользователей метода, но фактическая реализация скрыта от нас.
до этого момента казалось бы, что инкапсуляция полностью зависит от способности программирования язык, чтобы скрыть детали, и, следовательно, что это не может быть достигнуто без модификаторов доступа, не так ли?
Без Модификаторов Доступа
однако, как язык, такой как Python, достигает инкапсуляции, когда у него нет модификаторов доступа? В Python все открыто? Означает ли это, что инкапсуляция невозможна?
Что делать, если по соглашению мы определяем открытый интерфейс наших компонентов, а затем получаем доступ только к состоянию и поведению объектов через их публичный интерфейс? Очевидно, для этого нам нужно четкое понимание абстракций в нашей проблемной области и того, как они должны потребляться нашими пользователями.
мне кажется, что вопрос интервью был призван оценить инкапсуляцию как более широкое понятие, зависящее от определения очень четких абстракций, а не только как побочный продукт языковой функции, такой как модификаторы доступа.
роль Абстракция
вот почему, на мой взгляд, чтобы действительно понять инкапсуляцию, сначала нужно понять абстракцию.
подумайте, например, на уровне абстракции в концепции автомобиля. Автомобиль сложен в своей внутренней реализации. Они имеют несколько подсистем, как система передачи, система перерыва, топливная система, etc.
тем не менее, мы упростили его абстракцию, и мы взаимодействуем со всеми автомобилями в мире через публичный интерфейс их отведение. Мы знаем, что все автомобили имеют руль, посредством которого мы контролируем направление, у них есть педали, которые при нажатии ускоряет автомобиль и скорости, и другого, что при ее нажатии вы можете это остановить, и у вас есть рычаг, который позволяет управлять, если вы идете вперед назад. Эти особенности составляют общий интерфейс абстракции автомобилей. Утром вы можете управлять седаном, а затем выйти из него и управлять внедорожником во второй половине дня как будто это одно и то же.
Это не значит, что вы не можете открыть капот и посмотреть, как все это работает. Однако мало кто из нас знает детали того, как все эти базовые функции реализованы под капотом, и правда в том, что нам не нужно знать детали, чтобы управлять автомобилем. Все эти вещи помещены под забор машину. Нам нужно только знать публичный интерфейс абстракции.
подумайте о времени, когда автомобили не имели гидравлики направленного система. Однажды производители автомобилей изобрели его,и они решили поместить его в автомобили оттуда. Тем не менее, это не изменило способ взаимодействия пользователей с ними. Самое большее, потребители испытали улучшение в пользе дирекционной системы. Такое изменение было возможно, потому что внутри автомобиля был инкапсулирован.
это ясно показывает, что сокрытие деталей о том, как были направлены системы реализованные, они могли смело менять его без влияния на публичный интерфейс автомобиля и, соответственно, без влияния на то, как пользователи взаимодействовали с ним.
Теперь подумайте, что производители автомобилей решили поставить топливный колпачок ниже автомобиля, а не в одну из его сторон. Вы идете и покупаете один из этих новых автомобилей, и когда у вас заканчивается бензин, вы идете на заправку, и вы не находите топливный колпачок. Внезапно ты понимаешь, что находишься под машиной, но не можешь до нее дотянуться. с бензонасоса шланг. Теперь мы разорвали контракт на публичный интерфейс, и поэтому весь мир ломается, он разваливается, потому что все работает не так, как ожидалось. Такое изменение обойдется в миллионы. Нам нужно поменять все бензоколонки в мире. Когда мы нарушаем инкапсуляцию, мы должны заплатить цену.
Итак, как вы можете видеть, цель инкапсуляции -минимизировать взаимозависимость и облегчить изменение. Вы увеличиваете заключение минимизация экспозиции деталей реализации. Состояние класса должно быть доступно только через его открытый интерфейс.
красота инкапсуляции сила изменения вещей, не затрагивая своих пользователей.
мы могли бы сказать, что эта конечная цель зависит от тщательного планирования и проектирования. В Java модификаторы доступа-это способ воплотить эти идеи в жизнь, но в языке, где эта функция не существует, одинаково возможно достичь инкапсуляция.
в классе атрибуты и поведение помещаются вместе. Инкапсуляция означает, что при создании класса это само по себе означает, что вы реализуете принцип инкапсуляции. Потому что данные и поведение инкапсулируются в класс. Таким образом, скрытие данных является основной частью термина - инкапсуляция. А это означает точки доступа объекта.
Я видел, что много обсуждений уже сделано, просто чтобы упростить мое понимание:
инкапсуляция Гарантирует, что на поведение объекта можно повлиять только через его API. Это позволяет нам контролировать, насколько изменение одного объекта повлияет на другие части система, гарантируя отсутствие неожиданных зависимостей между несвязанные компоненты.Модификатор доступа может использоваться для инкапсуляции.
информация прячется!--4--> Скрывает, как объект реализует свою функциональность за абстракцией его API. Это позволяет нам работать с более высокими абстракциями, игнорируя детали более низкого уровня это не имеет отношения к поставленной задаче. Абстракция на уровне проектирования может использоваться для скрытия данных.
самое простое определение инкапсуляции - "привязка данных и кода, который управляет данными в одну единицу", так что данные не могут быть доступны непосредственно внешним миром.
в языке структуры, таком как данные c, объявляются в начале блока и используются напрямую, доступны открыто(любой Том, Дик и Гарри могут получить доступ к данным).
Скрытие данных-это концепция ограничения доступа к данным напрямую и открыто для любого Тома Дика и Гарри.
Инкапсуляция-один из способов получения данных прячется.
Вы достигаете скрытия данных, объединяя данные и функции (инкапсуляция).
Как вы достигаете в JAVA, см. любой пример функции getter(), setter() в JAVA. Проверьте это
Как я вижу , инкапсуляция относятся к идее привязка данных и метод до один блок класс . Однако есть два основных критерия для привязки данных и методов . Один из них-сокрытие информации, но не единственный . Быть совершенно краткий Я бы сказал, что два основных критерия
- Низкие Сцепные (убедитесь, скрывая информацию)
- Высокая Сплоченность
инкапсуляция: инкапсуляция является одним из столпов OOPS, также является надмножеством для двух других терминов, скрытия данных и абстракции. (Сокрытие данных, как это называется.. Данные могут храниться только в переменных. Чтобы скрыть данные от внешнего мира, мы используем концепцию скрытия данных. Public, Private, Protected это три модификатора доступа, предоставленные нам для скрытия данных. Значение по умолчанию ограничено пакетом. Protected ограничен унаследованным классом.) ** Частные переменные доступны только внутри класса это означает, что если есть внутренний класс, то могут быть вызваны и частные переменные. Только статические внутренние классы могут вызывать статические переменные.
теперь переходим к абстракции (что означает нематериальное). Абстракция также рассматривается как процесс, чтобы скрыть реализацию от пользователя и предоставить только конечный результат. Пример: у нас есть класс person, который имеет свойство "вес". Это свойство довольно сложно, потому что мы не можем принять меньше 0 вес для человека. Также мы не можем принять более 500 кгс. Поэтому скрытие реализации для них будет в методе setter. Эта вещь, скрывающая детали реализации, является абстракцией.
** и полный пакет, т. е. создание объекта private и реализация логики в setter и getter, называется инкапсуляцией.
- инкапсуляция-это объединение данных (полей) и поведения (методов) вместе в классах.
- теперь вы должны предоставить контроль доступа к данным с помощью модификаторов доступа (private/protected/public или default), который скрывает данные. Это защищает данные от внешнего мира, где вы не хотите предоставлять доступ.
- кроме того, чтобы скрыть сложность операций, вы должны использовать интерфейсы для достижения абстракции.
инкапсуляция означает привязку элементов данных и метода(поведения) в одном блоке и предоставление столько информации, сколько требуется пользователю, вы можете легко сказать [инкапсуляция=скрытие данных+абстракция].
класс полностью инкапсулированный элемент в java
сокрытие данных означает объявление переменных данных как частных, чтобы защитить их от несанкционированного доступа, но если вы даете некоторый публичный метод setter и getter для проверки.
процесс определения класса путем сокрытия его данных от прямого доступа со стороны внешнего члена класса и предоставления доступа только через общедоступный метод setter и getter через правильную проверку называется инкапсуляцией.
процесс связывания элементов данных и соответствующих методов в одну единицу-это не что иное, как encapuslation.
Инкапсуляция = Скрытие Данных + Абстракция
скрытие данных означает, что мы обеспечиваем безопасность данных в классе.
абстрагирование означает скрытие кода путем определения функций-членов.
инкапсуляция-это сочетание абстракции и сокрытия данных, означает, что мы упаковка данных и кода, связанного с этими данными. Для класса ex bean
class student {
private int age; // Data Hiding
public setAge(){} // Abstraction
public getAge(){} // Abstraction
}
класс студента инкапсулирован.
инкапсуляция = скрытие данных + абстракция
инкапсуляция инкапсуляция-это концепция объектно-ориентированного программирования это связывает вместе данные и функции, которые управляют данными, и это предохраняет и от внешнего вмешательства, и от неправильного использования. Данные инкапсуляция привела к важной концепции ООП сокрытия данных.
Если класс не позволяет вызывать код для доступа к внутренним данным объекта и разрешает доступ только через методы, это сильный форма абстракция или скрытие информации, известное как инкапсуляция. Некоторые языки (например, Java) позволяют классам применять ограничения доступа явно, например, обозначение внутренних данных с помощью private ключевое слово и методы обозначения, предназначенные для использования кодом вне класс с ключевым словом Public. Методы также могут быть разработаны публично, частные, или промежуточные уровни как защищенный (который позволяет доступу из одного и того же класса и его подклассов, но не объектов другого класс.) В других языках (например, Python) это обеспечивается только соглашение (например, частные методы могут иметь имена, которые начинаются с подчеркиванием). Инкапсуляция предотвращает появление внешнего кода о внутренней работе объекта. Это облегчает рефакторинг кода, например, позволяющий автору класса изменение способа внутреннего представления данных объектами этого класса без изменения внешнего кода (до тех пор, пока "общедоступный" метод вызывает работать одинаково путь.) Он также призывает программистов поместить весь код это касается определенного набора данных в том же классе, который организует его для легкого понимания другими программистами. Инкапсуляция-это метод, который поощряет развязку.
в основном инкапсуляция данных-это процесс, а скрытие данных-это техника . В инкапсуляции данные могут быть общедоступными или частными, но в данных скрытие данных является только частным. Таким образом, скрытие данных использует инкапсуляцию, но также использует различные методы для сохранения данных, разрешенных только для авторизованного доступа. Надеюсь, это поможет!