После перевода объекта супертипа в подтип, когда я вызываю любой метод объекта супертипа, они фактически не вызываются
class A{
void amethod(){
System.out.println("amethod");
}
void overridenmethod(){
System.out.println("in A");
}
}
class B extends A{
void bmethod(){
System.out.println("bmethod");
}
void overridenmethod(){
System.out.println("in B");
}
}
class Test{
public static void main(String args[]){
A a1 = new A();
if(a1 instanceof B){
B b1 = (B) a1;
b1.amethod();
b1.overridenmethod();
}
}
}
Этот код не дает никаких ошибок времени компиляции или выполнения. Но вывод пуст. На консоли ничего не печатается. Я ожидал вывода ниже:
amethod
in A
Что я делаю неправильно? Пожалуйста помоги. заранее спасибо
1 ответ
Что я делаю неправильно?
A a1 = new A();
if(a1 instanceof B){
B b1 = (B) a1;
b1.amethod();
b1.overridenmethod();
}
не будет выполнять тело, потому что a1
если не пример B
, instanceof
выражение всегда ложно.
Если вы создаете экземпляр с new A(...)
результат может быть использован как A
или как любой супертип или интерфейс A
(в вашем случае это только Object
).
B
это подтип A
, так что вы можете лечить любой B
как A
(с его переопределенными методами, заменяющими A
один), но НЕ наоборот.
И не имеет значения, где вы храните ссылку на ваш A
экземпляр - это ничего не меняет в том, что экземпляр является A
,