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

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

private class Joe
protected class Joe
public class Joe
class Joe

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

Подробнее см. JLS.

Ответ 3

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

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

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

package humanity;
class Person {}

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

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