Як вже згадувалося в інших відповідях, можливість додавати реалізацію до інтерфейсу була додана для того, щоб забезпечити сумісність із зворотною сумісністю в рамках колекцій. Я заперечую, що забезпечення зворотної сумісності потенційно є єдиною вагомою причиною для додавання реалізації в інтерфейс.
В іншому випадку, якщо ви додасте реалізацію в інтерфейс, ви порушуєте основний закон, чому інтерфейси були додані в першу чергу. Java є єдиною мовою успадкування, на відміну від C ++, яка дозволяє отримати багаторазове успадкування. Інтерфейси забезпечують переваги введення тексту, що надходять з мовою, яка підтримує багатократне успадкування, не вводячи проблем, що виникають із багаторазовим успадкуванням.
Більш конкретно, Java дозволяє лише одинакове успадкування реалізації, але вона дозволяє багатократно успадковувати інтерфейси. Наприклад, дійсний код Java:
class MyObject extends String implements Runnable, Comparable { ... }
MyObject
успадковує лише одну реалізацію, але вона успадковує три договори.
Java передавала багатократне успадкування реалізації, оскільки множинне успадкування реалізації виникає з безліччю тернистих проблем, які виходять за рамки цієї відповіді. Інтерфейси були додані, щоб дозволити багаторазове успадкування контрактів (він же інтерфейсів) без проблем багаторазового успадкування реалізації.
На підтвердження моєї точки зору, ось цитата Кена Арнольда та Джеймса Гослінга з книги "Мова програмування Java", 4-е видання :
Однозначне успадкування виключає деякі корисні та правильні конструкції. Проблеми багаторазового успадкування виникають внаслідок багаторазового успадкування реалізації, але у багатьох випадках множинне спадкування використовується для успадкування ряду абстрактних контрактів і, можливо, однієї конкретної реалізації. Надання засобів для успадкування абстрактного контракту без успадкування реалізації дозволяє набрати переваги від багаторазового успадкування без проблем багаторазового успадкування. Успадкування абстрактного договору називається
спадкоємністю інтерфейсу . Мова програмування Java підтримує успадкування інтерфейсу, дозволяючи оголосити interface
тип