Доступность 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 источника. Как вы можете видеть, они находятся в разных пакетах, и компиляция завершится неудачно.