Наследование от абстрактного класса в Java
Конкретный класс наследует абстрактный через extends
и обязан реализовать все абстрактные методы родителя. После
этого объект потомка можно хранить в переменной типа родителя -
так связывают разные реализации одним именем типа.
Запись и страница наследуют Content. Ссылки типа
Content могут указывать на разные потомки:
abstract class Content {
protected String title;
public Content(String title) {
this.title = title;
}
public abstract String render();
}
class Post extends Content {
private String text;
public Post(String title, String text) {
super(title);
this.text = text;
}
@Override
public String render() {
return "post " + title;
}
}
class Page extends Content {
public Page(String title) {
super(title);
}
@Override
public String render() {
return "page " + title;
}
}
В методе main положим в массив ссылки на базовый тип
и вызовем render у каждого элемента:
public class Main {
public static void main(String[] args) {
Content[] items = {
new Post("news", "hello"),
new Page("about")
};
for (Content item : items) {
System.out.println(item.render());
}
}
}
Java выбирает реализацию метода по фактическому типу объекта,
хотя переменная объявлена как Content. Создать элемент
массива через new Content(...) по-прежнему нельзя -
нужен конкретный класс-потомок.
Создайте массив User[] (абстрактный
User с методом getLabel),
положите в него объекты Employee
и Student и выведите метки всех
элементов в цикле.