В чем разница между общедоступным, защищенным, частным и частным в Java?

Статья CodeProject Как получить идентификатор владельца процесса и текущий идентификатор пользователя от Warlib описывает, как это сделать, используя WMI и используя Win32 API через PInvoke.

Код WMI намного проще, но выполняется медленнее. В вашем вопросе не указывается, что было бы более подходящим для вашего сценария.

2925
задан Steve Chambers 11 September 2018 в 14:54
поделиться

8 ответов

официальное учебное руководство может быть несколько полезным Вам.

______________________________________________________________
|           │ Class │ Package │ Subclass │ Subclass │ World  |
|           │       │         │(same pkg)│(diff pkg)│        |
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|public     │   +   │    +    │    +     │     +    │   +    | 
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|protected  │   +   │    +    │    +     │     +    │        | 
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|no modifier│   +   │    +    │    +     │          │        | 
|───────────┼───────┼─────────┼──────────┼──────────┼────────|
|private    │   +   │         │          │          │        |
|___________|_______|_________|__________|__________|________|
 + : accessible         blank : not accessible
5311
ответ дан Istiaque Hossain 11 September 2018 в 14:54
поделиться
  • 1
    Dave, честно спасибо за Ваш вход, но Вас don' t знают что I' m выполнение и почему мне нужно что I' m выполнение. Я can' t использование, contenteditable, потому что я сериализирую использование jQuery и ввод сохраненных данных назад снова так же - также как не WYSIWYG тогда there' s никакой смысл. Я также can' t имеют отдельные поля в течение каждого дня, потому что это только " guide" текст. Это будет введено в документ слова в конце, и они могли бы хотеть изменить формат. Кроме того, честно, вопросом был " как делают я получаю разрывы строки, не имея необходимость не располагать мой code" с отступом; и Marcx ответил на это отлично. – Thomas Clayson 2 November 2011 в 14:44

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

17
ответ дан Joe Phillips 11 September 2018 в 14:54
поделиться
  • 1
    Спасибо за большой ответ Вы препятствовали тому, чтобы я вытянул мой слышать из моей головы! I' ve один вопрос, хотя, является там каким-либо возможным способом предоставить нулевого указателя при определении ссылочных участников? – Tim Visée 20 February 2014 в 22:59

Ответ David обеспечивает значение каждого модификатора доступа. Что касается того, когда использовать каждого, я предложил бы обнародовать все классы и методы каждого класса, которые предназначены для наружного применения (его API), и все остальное частное.

Со временем Вы будете развивать чувство для того, когда сделать некоторые классы частными на пакет и когда объявить определенные методы, защищенные для использования в подклассах.

8
ответ дан Peter Mortensen 11 September 2018 в 14:54
поделиться

Легкое правило. Запустите с объявления всего частного. И затем продвижение к общественности как потребности возникает и разрабатывает, гарантирует его.

, Когда представляющие участники спрашивают себя, если Вы представляете выбор представления или выбор абстракции. Первое является чем-то, чего Вы хотите избежать, поскольку это представит слишком много зависимостей от фактического представления, а не от его заметного поведения.

Как правило я стараюсь избегать реализаций метода переопределения путем разделения на подклассы; слишком легко завинтить логику. Объявите абстрактные защищенные методы, если Вы намереваетесь для него быть переопределенными.

кроме того, используйте @Override аннотацию при переопределении для препятствия вещей повредиться, когда Вы осуществите рефакторинг.

153
ответ дан kvantour 11 September 2018 в 14:54
поделиться
  • 1
    Я don' t верят этому. IT РАБОТАЛ!!! Я даже купил новый компьютер, чтобы избавиться если это!! Конечно, это didn' t работа, просто улучшенная немного. ЧУВАК СПАСИБО!!! я могу много раз голосовать за многих??? – Daniel Dolz 15 December 2012 в 17:31

(Протест: Я не программист Java, я - программист Perl. Perl не имеет никаких формальных мер защиты, который является, возможно, почему я понимаю проблему так хорошо:))

Частный

Как Вы думали бы, только класс , в котором это объявляется, видит его.

Пакет, Частный

, Может только замечаться и использоваться пакет , в котором это было объявлено. Это - значение по умолчанию в Java (который некоторые рассматривают как ошибку).

Защищенный

Пакет, Частный +, виден участнику пакета или подклассам.

Общественность

Все видят его.

Опубликованный

Видимый вне кода я управляю. (В то время как не синтаксис Java, это важно для этого обсуждения).

C++ определяет дополнительный уровень, названный "другом" и меньше Вы знаете об этом лучше.

, Когда необходимо использовать что? Вся эта мысль является инкапсуляцией для сокрытия информации. Как можно больше Вы хотите скрыть деталь того, как что-то сделано от Ваших пользователей. Почему? Поскольку тогда можно изменить их позже и не повредить чей-либо код. Это позволяет Вам оптимизировать, осуществить рефакторинг, перепроектировать и исправить ошибки без беспокойства, что кто-то использовал тот код, который Вы просто перестроили.

Так, эмпирическое правило должно сделать вещи только столь видимыми, как они должны быть. Запустите с частного и только добавьте больше видимости по мере необходимости. Только обнародуйте, что то, которое абсолютно необходимо для пользователя для знания, каждая деталь, которую Вы обнародовали, ограничивает Вашу способность перепроектировать систему.

, Если Вы хотите, чтобы пользователи были в состоянии настроить поведения, вместо того, чтобы обнародовать внутренности, таким образом, они могут переопределить их, это часто - лучшая идея пихнуть те кишки в объект и обнародовать тот интерфейс. Тем путем они могут просто включить новый объект. Например, если Вы писали проигрыватель компакт-дисков и хотели, "идут, находят, что информация об этом CD" укусила настраиваемый, а не обнародовала те методы, Вы поместили всю эту функциональность в ее собственный объект и делаете просто Вашу объектную общественность метода get/метода set. Таким образом быть скаредным о представлении Ваших кишок поощряет хороший состав и разделение проблем

Лично, я придерживаюсь только с "частным" и "общедоступным". Много языков OO просто имеют это. "Защищенный" может быть удобным, но это - действительно обман. Как только интерфейс является более, чем частным, это за пределами Вашего управления, и необходимо пойти, смотря в коде других людей для нахождения использования.

Это - то, где идея "опубликованных" входит. Изменение интерфейса (рефакторинг его) требует, чтобы Вы нашли весь код, который использует его, и измените это, также. Если интерфейс является частным, хорошо без проблем. Если это защитило Вас, должны пойти, находят все Ваши подклассы. Если это общедоступно, необходимо пойти, находят весь код, который использует код. Иногда это возможно, например, если Вы работаете над корпоративным кодом, это для внутреннего пользования, только не имеет значения, если интерфейс общедоступен. Можно захватить весь код из корпоративного репозитория. Но если интерфейс "публикуется", если существует код с помощью него вне управления, тогда Вы политы из шланга. Необходимо поддерживать тот интерфейс или рискнуть повреждать код. Даже защищенные интерфейсы можно считать опубликованными (который является, почему я не беспокоюсь защищенным).

Много языков находят, что иерархическая природа общедоступных/защищать/частных также ограничивает а не в соответствии с действительностью. С этой целью существует понятие класс черты, но это - другое шоу.

438
ответ дан Schwern 11 September 2018 в 14:54
поделиться
  • 1
    @TimVisee, Не уверенный, если it' s возможный - по крайней мере, в портативном устройстве, не UB путь - но you' d заканчиваются с недопустимой ссылкой. Если Вы хотите ПУСТУЮ семантику, просто используют указатель или возможно используют что-то как Дополнительное Повышение. – Eugen Constantin Dinca 22 February 2014 в 04:39
  • общественность

    , Если участник класса объявляется с общественностью затем, к ней можно получить доступ отовсюду

  • , защитил

    , Если участник класса объявляется с ключевым словом, защищенным затем, к ней можно получить доступ от тех же участников класса вне участников класса в том же пакете и наследованных участников класса. Если участник класса защищен затем, к этому нельзя получить доступ от внешнего класса пакета, если внешний упакованный класс не наследован т.е. расширяет другой суперкласс пакета. Но член защищенного класса всегда доступен тем же классам пакета, погода НЕ имеет значения, что тот же класс пакета наследован или НЕ

  • , значение по умолчанию

    В значении по умолчанию Java НЕ является ключевым словом модификатора доступа. Если участник класса объявляется без какого-либо ключевого слова модификатора доступа затем в этом случае, это рассматривают как участника по умолчанию. Участник класса по умолчанию всегда доступен тем же участникам класса пакета. Но вне класса пакета участник НЕ может получить доступ к участникам класса по умолчанию, даже если вне классов подклассы в отличие от защищенных участников

  • частный

    , Если участник класса объявляется с ключевым словом, защищенным затем в этом случае, это доступно ТОЛЬКО тем же участникам класса

0
ответ дан 22 November 2019 в 19:47
поделиться

private-protected-public-perfect-analogy-for-the-variable-data-types

После блок-схемы объясняют, как элементы данных [1 110] базовый класс , наследовался , когда производный класс режим доступа частный .

enter image description here

Примечание: Объявление элементов данных с частным спецификатором доступа известно как [1 114] сокрытие данных.

Источник: Спецификаторы доступа †“Частный, Общедоступный и Защищенный

0
ответ дан 22 November 2019 в 19:47
поделиться

Мои два цента :)

частный:

класс-> высокоуровневый класс не может быть частным. внутренние классы могут быть частными, которые доступны от того же класса.

переменная экземпляра-> доступный только в классе. Не может получить доступ вне класса.

частный на пакет:

класс-> высокоуровневый класс может быть частным на пакет. Это может только быть доступно от того же пакета. Не от sub пакета, не от внешнего пакета.

переменная экземпляра-> доступный от того же пакета. Не от sub пакета, не от внешнего пакета.

защищенный:

класс-> высокоуровневый класс не может быть защищен.

переменная экземпляра-> Только доступный в том же пакете или подпакете. Может только быть доступ вне пакета при расширении класса.

общественность:

класс-> доступный от package/subpackage/another пакета

, переменная экземпляра-> доступный от package/subpackage/another пакета

Здесь детализирована, отвечает

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md

1
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: