Чтобы быть простым, абстрактный класс означает, что вы не можете создать новый экземпляр этого класса.
Тем не менее, по-прежнему можно объявить объект как Ship
(типа во время компиляции против выполнения типа), чтобы использовать полиморфизм, позволяет сделать некоторые смешные вещи, как массив Ship
, который содержит как Submarine
и Destroyer
(и многие другие).
Ship[] army = new Ship[2];
army[0] = new Submarine("0");
army[1] = new Destroyer("1");
for(Ship s : army) {
s.fire();
}
В этом примере, мы можем вызвать fire()
на два объекта, поскольку fire()
является метод Ship
. Поскольку атака корабля зависит от типа корабля (подводная лодка не срабатывает, как эсминца), вы устанавливаете метод fire()
в Ship
и реализуете его в Submarine
и Destroyer
.
Эти трюки необходимы в ООП и позволяют реализовать мощные шаблоны проектирования. Если вы новичок, смотрит на strategy pattern и template method pattern, они изменили свое видение ООП несколько лет назад)
Надежда этот маленький пример поможет вам :)
Просто потому, что вы не можете создать экземпляр абстрактного класс, не означает, что вы не можете иметь объект такого типа. Вы также можете иметь объекты определенного интерфейса, например 'List stringings = new ArrayList <>();' –
Davio
Потому что в этой строке вы создаете объект типа 'Submarine', а затем набрасываете его на тип' Ship'. 'Submarine' IS-A' Ship' – SimY4
Прочтите этот: http://stackoverflow.com/questions/4321386/create-object-of-abstract-class-and-interface –