Ответ
Методы, не имеющие реализации (тела), — это абстрактные (abstract) методы.
Где они объявляются:
-
В абстрактных классах:
abstract class Animal { // Абстрактный метод — нет тела, только сигнатура. abstract void makeSound(); // Обычный метод — имеет реализацию. void sleep() { System.out.println("Zzz..."); } } - В интерфейсах (до Java 8): Все методы интерфейса по умолчанию были
public abstract.
Как они используются: Абстрактный метод обязан быть реализован (переопределен) в первом конкретном (неабстрактном) классе-наследнике.
class Dog extends Animal {
// Реализация абстрактного метода.
@Override
void makeSound() {
System.out.println("Гав!");
}
}
Исключение (с Java 8): В интерфейсах появились методы default и static, которые имеют реализацию.
Ответ 18+ 🔞
А, ну вот, смотри, абстрактные методы, блядь! Это такие, которые как бы есть, а на самом деле нихуя нет. Как обещание позвонить, ёпта.
Где они, эти призраки, обитают:
-
В абстрактных классах: Там они и живут, сука, как дома.
abstract class Animal { // Абстрактный метод — объявил, а делать него хуй. За тебя сделают. abstract void makeSound(); // А это уже нормальный метод, рабочий, не лентяй. void sleep() { System.out.println("Zzz..."); } } - В интерфейсах (в старые добрые времена): Раньше там все методы были по умолчанию
public abstract, ядрёна вошь. Одна сплошная абстракция, пиздец.
И как с этим жить? А жить просто: первый неленивый ублюдок, который унаследует этот класс, обязан этот метод реализовать. Иначе компилятор ему ебло набьёт.
class Dog extends Animal {
// Вот, добросовестный гражданин, переопределил. Молодец, пёс.
@Override
void makeSound() {
System.out.println("Гав!");
}
}
Но! Времена меняются, блядь. С Java 8 в интерфейсах завелись методы default и static — у них уже есть тело, они уже не голые. Так что теперь не всё так однозначно, в рот меня чих-пых.