Вроде и нет, с появлением Java8 вы можете в основном использовать конкретные методы в интерфейсах.
Примерно так.
public interface IHelloWorld {
public default void print() {
System.out.println("Hello World");
}
}
Теперь вы можете реализовать класс или анонимный класс, который реализует этот интерфейс и использовать print (), как если бы вы писали этот метод в абстрактном классе.
Важно:
Сначала вы не можете создавать прямые переменные в вашем интерфейсе. Вы можете преодолеть это, введя методы получения и установки, но это было бы плохой практикой.
Также вы не можете установить этот метод окончательным.
Невозможно сделать это:
public final default void print() {
System.out.println("Hello World");
}
Это может показаться небольшой проблемой, но в реальном мире это может быть проблемой. Иногда вам действительно нужен последний метод, чтобы дети его вообще не меняли.
В заключении с Java8 вы также можете реализовать значения по умолчанию в интерфейсах, однако вы не можете установить их как окончательные, а также более важный факт, что вы не можете создавать переменные класса, потому что это, очевидно, не класс.