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