Как Java ограничивает множественное наследование?

avatar
Rishabh Prasad
8 апреля 2018 в 04:58
263
2
-1

Прочитав о множественном наследовании или проблеме алмазов в Java, я понял, что они не поддерживаются. Но мне интересно, как Java на самом деле ограничивает множественное наследование?

Существует ли какой-либо класс для проверки того, передает ли программист более одного имени класса после ключевого слова extends, или какой-либо другой способ обнаружения этой функциональности?

Я прочитал несколько статей, но ничего не говорит о том, как именно Java предотвращает множественное наследование, за исключением одного распространенного ответа, что он выдает ошибку: classname наследует несколько классов.

Источник
user3437460
8 апреля 2018 в 04:59
0

Когда вы пишете более 1 класса после extends.. разве это не так?

user5818995
8 апреля 2018 в 05:02
1

Более одного имени класса после ключевого слова extends является ошибкой времени компиляции. Если вы не можете скомпилировать программу, вы не можете ее запустить. Вот как Java предотвращает множественное наследование.

Rishabh Prasad
8 апреля 2018 в 05:04
0

@ user3437460 Не очень уверен в этом. Прохождение теоретических чтений.

Ответы (2)

avatar
Stephen C
8 апреля 2018 в 05:11
5

Но мне интересно, как Java на самом деле ограничивает множественное наследование?

Это запрещено на уровне синтаксиса. Синтаксис объявления класса допускает одно имя класса после ключевого слова extends. И имена в списке implements должны быть именами интерфейсов, а не именами классов. См. раздел 8.1 Объявления классов JLS. Компилятор проверяет обе эти вещи. Исходный код Java, который пытается объявить несколько суперклассов, не будет компилироваться.

На уровне реализации формат файла ".class" позволяет указывать только один класс как super_class; см. структуру ClassFile в разделе 4.1 спецификации JVM. Все идентификаторы в interfaces должны относиться к интерфейсам. Различные ограничения файлов классов, указанные в спецификации JVM, применяются собственным загрузчиком классов JVM.


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

avatar
Logan
8 апреля 2018 в 05:02
2

Если вы попытаетесь расширить более одного класса, компилятор на самом деле выдаст сообщение об ошибке error: '{' expected. Если вам интересно, какая часть JDK на самом деле делает это, я предлагаю взглянуть на исходники OpenJDK. Исходный код парсера javac можно найти здесь.

В качестве примечания, Java запрещает множественное наследование состояния, о чем вы говорите. Однако вы все равно можете добиться множественного наследования поведения за счет реализации нескольких интерфейсов.