Подтвердить что ты не робот

Что такое модификатор доступа по умолчанию?

Я только начал читать книгу по Java и удивился; какой модификатор доступа является значением по умолчанию, если он не указан?

4b9b3361

Ответ 1

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

Как указывалось mdma, это не так для членов интерфейса, для которых по умолчанию используется "public".

См. Спецификаторы Java Access

Ответ 2

Спецификатор по умолчанию зависит от контекста.

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

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

Для членов интерфейса (полей и методов) доступ по умолчанию является общедоступным. Но обратите внимание, что в объявлении интерфейса по умолчанию используется пакет private.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

Если у нас есть объявление

public interface MyInterface2 extends MyInterface
{

}

Классы, использующие MyInterface2, могут видеть поля1 и метод1 из суперинтерфейса, потому что они общедоступны, хотя они не могут видеть объявление самого MyInterface.

Ответ 3

Если спецификатор доступа не указан, это доступ к пакетному уровню (для этого нет явного спецификатора) для классов и членов класса. Методы интерфейса неявно общедоступны.

Ответ 4

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

Интересно отметить, что защищенный не ограничивает видимость для подклассов, а также для других классов в одном пакете

Ответ 5

Это зависит от того, что это за вещь.

  • Типы верхнего уровня (то есть классы, перечисления, интерфейсы и типы аннотаций, не объявленные внутри другого типа) по умолчанию являются закрытыми для пакетов. (JLS §6.6.1)

  • В классах все члены (то есть поля, методы и объявления вложенных типов) и конструкторы по умолчанию закрыты для пакета. (JLS §6.6.1)

    • Когда класс не имеет явно объявленного конструктора, компилятор вставляет конструктор по умолчанию с нулевым аргументом, который имеет тот же спецификатор доступа, что и класс. (JLS §8.8.9) Конструктор по умолчанию обычно искажается как всегда общедоступный, но в редких случаях это не эквивалентно.
  • В перечислениях, Конструкторы являются частными по умолчанию. Действительно, перечислители-перечислители должны быть закрытыми, и ошибочно указывать их как публичные или защищенные. Константы enum всегда общедоступны и не разрешают какой-либо спецификатор доступа. Другие члены перечислений по умолчанию закрыты для пакета. (JLS §8.9)

  • В интерфейсах и типах аннотаций все члены (опять же, это означает, что поля, методы и объявления вложенных типов) являются открытыми по умолчанию. Действительно, члены интерфейсов и типы аннотаций должны быть открытыми, и ошибочно указывать их как частные или защищенные. (JLS §9.3–9.5)

  • Локальные классы - это именованные классы, объявленные внутри метода, конструктора или блока инициализатора. Они ограничены областью {.. } в которой они объявлены, и не разрешают какой-либо спецификатор доступа. (JLS §14.3) Используя рефлексию, вы можете создавать экземпляры локальных классов из других мест, и они являются частными пакетами, хотя я не уверен, есть ли эта деталь в JLS.

  • Анонимные классы - это пользовательские классы, созданные с помощью new которые указывают тело класса непосредственно в выражении. (JLS §15.9.5) Их синтаксис не допускает какого-либо спецификатора доступа. Используя рефлексию, вы можете создавать экземпляры анонимных классов из других источников, и они, и их сгенерированные конструкторы являются частными пакетами, хотя я не уверен, что эта деталь есть в JLS.

  • Блоки экземпляра и статического инициализатора не имеют спецификаторов доступа на уровне языка (JLS §8.6 и 8.7), но блоки статического инициализатора реализованы как метод с именем <clinit> (JVMS §2.9), поэтому метод должен внутренне иметь некоторые спецификатор доступа. Я изучил классы, скомпилированные javac и Eclipse-компилятором с использованием шестнадцатеричного редактора, и обнаружил, что оба генерируют метод как пакетно-приватный. Однако вы не можете вызвать <clinit>() в языке, потому что символы < и > недопустимы в имени метода, а методы отражения жестко отрицают его существование, поэтому фактически его спецификатор доступа не имеет доступа. Метод может вызываться только виртуальной машиной во время инициализации класса. Блоки инициализатора экземпляра не компилируются как отдельные методы; их код копируется в каждый конструктор, поэтому к ним нельзя получить доступ по отдельности, даже путем отражения.

Ответ 6

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

  Access Levels
    Modifier    Class   Package Subclass  EveryWhere
    public        Y        Y       Y         Y
    protected     Y        Y       Y         N
    default       Y        Y       N         N
    private       Y        N       N         N

если вы используете в интерфейсе значение по умолчанию, вы сможете реализовать такой метод, как этот пример

public interface Computer {    
    default void Start() {
        throw new UnsupportedOperationException("Error");
    }    
}

Однако это будет работать только с 8 версии Java

Официальная документация

Модификаторы доступа в Java

Ответ 7

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

Ответ 8

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

Ответ 9

Вот цитата о видимости уровня пакета из интервью с Джеймсом Гослингом, создателем Java:

Bill Venners: Java имеет четыре уровня доступа. По умолчанию используется пакет. я всегда задавались вопросом, удобна ли настройка доступа к пакету по умолчанию потому что три ключевых слова, которые люди из С++ уже знали о были частными, охраняемыми и публичными. Или если у вас есть причина, по которой вы считали, что доступ к пакету должен быть по умолчанию.

Джеймс Гослинг: Пакет, как правило, представляет собой набор вещей, которые написанные вместе. В общем, я мог бы сделать одну из двух вещей. Один из них заключался в том, что вы всегда ставите ключевое слово, которое дает вам домен. Или у меня могло быть значение по умолчанию. И тогда возникает вопрос: что делает разумным дефолт? И я склоняюсь к тому, что меньше всего опасная вещь.

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

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

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

Некоторое время на самом деле было дружественное ключевое слово. Но поскольку все другие начинаются с "P", это было "дружелюбно" с "PH". Но это было только там, может быть, день.

http://www.artima.com/intv/gosling2P.html

Ответ 10

Обновить Java 8 использование ключевого слова default: Как и многие другие отметили видимость по умолчанию (без ключевого слова)

поле будет доступно изнутри того же пакета, к которому класс принадлежит.

Не путать с новой функцией Java 8 (Способы по умолчанию), которая позволяет интерфейсу предоставлять когда его помечено ключевым словом default.

Смотрите: Модификаторы доступа

Ответ 11

В JAVA существует модификатор доступа, называемый "по умолчанию", который позволяет прямое создание экземпляра этого объекта только внутри этого пакета.

Вот полезная ссылка:

Модификаторы/спецификации Java

Ответ 12

Прежде всего позвольте мне сказать одно: в java нет такого термина, как "Спецификатор доступа". Мы должны назвать все "модификаторами". Поскольку мы знаем, что финальные, статические, синхронизированные, volatile.... называются модификаторами, даже Public, private, protected, default, abstract также должны называться модификаторами. По умолчанию это такие модификаторы, где физического существования нет, но модификаторы не размещаются, поэтому его следует рассматривать как модификаторы по умолчанию.

Чтобы оправдать это, возьмите один пример:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

Выход будет: Hello Java

Теперь измените общедоступное на личное и посмотрите, какую ошибку компилятора вы получите: В нем говорится: "Модификатор private здесь запрещен" Какой вывод: кто-то может ошибаться, или какой-то учебник может быть неправильным, но компилятор не может ошибаться. Таким образом, мы можем сказать, что спецификатор доступа к терминалу в java не является модификатором.