С точки зрения того, должны ли классы быть окончательными или нет по умолчанию, это спорный вопрос, для которого на самом деле нет «правильного» ответа.Java решила сделать это одним способом, C # - другим, разные люди думают, что разные языки понимают это правильно и неправильно.
Лично мне нравится, как классы расширяются по умолчанию, если люди хотят сделать их окончательными, то они могутЭто всего лишь ключевое слово.Но разрешение подклассификации просто добавляет мне больше гибкости, и я уверен, что мне не нужно расширять каждый неконечный объект под солнцем, но если я хочу добавить некоторую степень специфического поведения, тогда у меня есть возможность сделать это.Да, можно использовать композицию (и в некоторых случаях ее следует использовать), но это не исключает и не должно исключать подклассификацию в качестве опции.Во многих случаях подклассифицированный объект выполняет отношения is-a с родителем, и в этом случае это правильный путь.Следует признать, что в прошлом этим злоупотребляли, даже в Java API (например, свойства не являются хеш-таблицей). Но если вы пытаетесь изменить язык, чтобы люди перестали быть глупыми - они всегда найдутОбходной путь!
Что касается того, чтобы сделать пакет классов закрытым, для меня эта опция была бы гораздо более полезной, если бы пакеты были иерархическими, а не плоскими.Да, они иерархичны по описанию, но что-то, объявленное пакетом private в org.me, недоступно из org.me.subpackage, что я часто чувствую необходимость сделать.К счастью, с добавлением суперпакетов мы могли бы лучше использовать эту опцию!