12. Класс может представлять собой как бы заготовку, в
которой часть методов реализована, а часть — нет. В этом случае в описании
класса перед словом class должен стоять описатель abstact и при описании нереализованных методов тоже должен
использоваться этот описатель.
Пример
public abstract
class D {
. . .
int
g1(int s) {
. . .
}
public abstract
void g2(String str);
. . .
}
В классе D метод g1 — это обычный метод, g2 — абстрактный,
он содержит только заголовок, но не содержит реализации.
Как видно из примера, тело абстрактного метода отсутствует,
сразу после заголовка метода стоит точка с запятой.
Абстрактный класс не может использоваться непосредственно
для порождения объектов. Для этого необходимо, используя этот класс как
базовый, породить другой класс, в котором нужно определить все абстрактные
методы. Тогда можно будет создавать объекты.
С другой стороны не запрещено описывать переменные
абстрактного класса. Просто им нужно присваивать ссылки на объекты
неабстрактных классов.
В этой ситуации всегда применяется upcasting.
Возвращаясь к примеру с печатными изданиями, можно отметить, что класс Issue можно было бы реализовать как абстрактный, определив но не реализовав в нем метод print(...). Тогда во всех порожденных классах (Book, Journal, Newspaper) пришлось бы реализовать метод print(...). Фрагмент, печатающий каталог, при этом остался бы прежним.