Потому что v
- это (бетон) Vehical
(думаю, вы имеете в виду транспортное средство).
Но «конкретный» экземпляр Vehical
- это не Car
. Это (неопределенный c) экземпляр Vehical
. Таким образом, v instanceof Car
- это false
.
Но c
- это конкретный экземпляр Car
, и поскольку Car
подкласс Vehical
c
также является Vehical
, потому что все экземпляры Car
также являются экземплярами Vehical
. Так что c instanceof Vehical
- это true
, потому что (в вашей модели) все 'Car' также являются `Vehical's (неявно по наследству).
Вы можете сделать Vehical
абстрактным классом, если вы не хотите экземпляров из Vehical
существуют, которые не являются более конкретным c типом Vehical
(например, Car
, Motorbike
?, Lorry
?). В реальном мире никогда не может быть транспортного средства, которое не является специфическим c видом транспортного средства.
Ерунда: Что ты водишь? Я вожу автомобиль. Какой автомобиль? Никакого конкретного вида, это просто транспортное средство!
Рекомендованной моделью было бы объявить interface
с именем Vehical
и реализовать его для каждого (более) конкретного типа Vehical
, потому что это наследование Модель может быть сложна в управлении. Но то, что вы сделали, действительно.