В чем разница между общедоступным, защищенным, частным и частным в Java? - PullRequest
2846 голосов
/ 18 октября 2008

В Java существуют четкие правила относительно того, когда использовать каждый из модификаторов доступа, а именно: значения по умолчанию (закрытый пакет), public, protected и private при создании class и interface и работе с ними. с наследством?

Ответы [ 24 ]

5 голосов
/ 06 апреля 2017

Часто я осознавал, что запоминание основных понятий любого языка стало возможным благодаря созданию реальных аналогий. Вот моя аналогия для понимания модификаторов доступа в Java:

Предположим, что вы студент университета, и у вас есть друг, который приедет к вам на выходные. Предположим, что в центре кампуса находится большая статуя основателя университета.

  • Когда вы приводите его в кампус, первое, что вы и ваш друг видите, это эта статуя. Это означает, что любой, кто ходит по кампусу, может посмотреть на статую без разрешения университета. Это делает статую как ОБЩЕСТВЕННАЯ .

  • Далее вы хотите отвести своего друга в общежитие, но для этого вам необходимо зарегистрировать его в качестве посетителя. Это означает, что он получает пропуск (такой же, как у вас), чтобы попасть в различные здания в кампусе. Это сделало бы его карту доступа как PROTECTED .

  • Ваш друг хочет войти в сеть Wi-Fi в кампусе, но у него нет учетных данных для этого. Единственный способ, которым он может выйти в Интернет, - это если вы поделитесь с ним своим логином. (Помните, что каждый студент, который поступает в университет, также имеет эти учетные данные). Это сделает ваши учетные данные для входа в систему как NO MODIFIER .

  • Наконец, ваш друг хочет прочитать ваш отчет о проделанной работе за семестр, который размещен на сайте. Тем не менее, у каждого студента есть свой личный логин для доступа к этому разделу сайта кампуса. Это сделало бы эти учетные данные как PRIVATE .

Надеюсь, это поможет!

5 голосов
/ 30 июля 2014

Public Protected Default и private являются модификаторами доступа.

Они предназначены для инкапсуляции или скрытия и отображения содержимого класса.

  1. Класс может быть общедоступным или по умолчанию
  2. Члены класса могут быть открытыми, защищенными, по умолчанию или личными.

Личное недоступно вне класса По умолчанию доступен только в пакете. Защищено как в пакете, так и в любом классе, который его расширяет. Общественность открыта для всех.

Обычно переменные-члены определяются как частные, но методы-члены являются открытыми.

4 голосов
/ 27 июня 2017

Когда вы думаете о модификаторах доступа, просто подумайте об этом (относится к обоим переменным и методам ):

public -> доступ из любого места
private -> доступно только в том же классе, где оно объявлено

Теперь путаница возникает, когда дело доходит до default и protected

default -> Отсутствует ключевое слово модификатора доступа. Это означает, что это доступно строго в пакете класса. Нигде вне этого пакета к нему нет доступа.

protected -> Чуть менее строгим, чем default, и кроме тех же классов пакетов к нему могут обращаться подклассы вне пакета , который объявлен.

2 голосов
/ 14 февраля 2018

Это все о инкапсуляции (или, как сказал Джо Филлипс, минимум знаний ).

Начните с самого ограничительного (частного) и посмотрите, не понадобятся ли вам в будущем менее ограничительные модификаторы.

Мы все используем модификаторы методов и членов, такие как private, public, ... но мало кто из разработчиков делает это, используя пакеты для организации кода логически.

Например: Вы можете поместить чувствительные методы безопасности в пакет «security». Затем поместите открытый класс, который обращается к некоторому коду, связанному с безопасностью, в этом пакете, но оставьте другие классы безопасности закрытым . Таким образом, другие разработчики смогут использовать общедоступный класс только из-за пределов этого пакета (если они не изменят модификатор). Это не функция безопасности, но она поможет использовать.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Другое дело, что классы, которые сильно зависят друг от друга, могут оказаться в одном и том же пакете и в конечном итоге могут быть реорганизованы или объединены, если зависимость слишком сильна.

Если, наоборот, вы установите все как public , не будет понятно, к чему следует или не нужно обращаться, что может привести к написанию большого количества javadoc (который ничего не применяет через компилятор. ..).

...