Почему Java "защищена" менее защищена, чем дефолт?

В Java у нас есть четыре спецификатора доступа: public, protected, package-private (по умолчанию) и private. Это хорошо известный и не проблема для меня.

Мой вопрос касается обозначения protected. Как показано в таблице здесь, задавая поле, спецификатор доступа по умолчанию для private-private предотвращает использование подклассов вне пакета, но применение ключевого слова protected doesn Фактически это защитит его. напротив, он открывает его для подклассов любого пакета.

Итак, почему protected не защищает вещи; почему он менее ограничительный, чем никакой модификатор?

Ответ 1

Если мы согласны с тем, что это четыре уровня доступа, которые должны существовать (private, package-private, package-private-plus-subclasses и public), и мы принимаем, что private-package должен быть стандартным уровнем доступа, когда вы не указывайте что-то еще, тогда возникает вопрос: "Почему пакет-private-plus-subclasses называется protected?" И ответ на этот вопрос заключается в том, что он заимствовал/унаследовал термин из С++ (который не имеет понятия "пакеты", но использует protected для обозначения "private-plus-subclasses" ).

(Я отправляю этот ответ в качестве вики сообщества, чтобы побудить других добавлять к нему, так как я предполагаю, что здесь больше истории, чем просто это. Кроме того, поскольку кто-то может захотеть добавить некоторое обоснование того, почему это четыре уровня доступа, которые должны существовать, например, почему у нас есть пакет-private-plus-subclasses, но нет private-plus-subclasses &mdash и почему пакет-private должен быть стандартным.)

Ответ 2

Так как это довольно открытый вопрос, я предлагаю некоторый полусогласованный исторический контекст. В Java 1.0 был добавлен дополнительный модификатор доступа, закрытый для защиты. Это было защищено за вычетом доступа к пакету. Этот модификатор был запутан, плохо реализован и удален на 1.1. Это помогает нарисовать изображение, что пакет является логическим модульным модулем, поэтому он является уровнем доступа по умолчанию.

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

Ответ 3

Защищенный является более ограничительным, чем общедоступным. Вот почему он называется тем, чем он является.

Я бы хотел, чтобы разработчики языка назвали спецификатор доступа по умолчанию "защищенным пакетом", потому что по умолчанию это очень запутывает множество программистов. Я бы предпочел, чтобы защищенные были по умолчанию или не было по умолчанию.