Доступность Java-класса

Немного связано с моим другим вопросом: в чем разница между следующим:

private class Joe
protected class Joe
public class Joe
class Joe

Еще раз, разница между последними двумя - это то, что меня больше всего интересует.

3 ответа

Решение

Открытый класс доступен для класса в любом пакете.

Класс с доступом по умолчанию (class Joe) виден только другим классам в том же пакете.

Закрытые и защищенные модификаторы могут применяться только к внутренним классам.

Закрытый класс виден только его вмещающему классу и другим внутренним классам в том же вмещающем классе.

Защищенный класс виден другим классам в том же пакете и классам, которые расширяют включающий класс.

  • private: видимый только для внешних классов
  • защищенный: видимый только для внешних классов
  • public: видимый для всех других классов
  • class: package-private, видимый для классов в одном пакете

Смотрите JLS для получения дополнительной информации.

Класс с доступом по умолчанию не имеет модификатора, предшествующего ему в объявлении.

Доступ по умолчанию - это доступ на уровне пакета, поскольку класс с доступом по умолчанию виден только классам в одном и том же пакете.

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

package humanity;
class Person {}

package family;
import humanity.Person;
class Child extends Person {}

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

Другие вопросы по тегам