После перевода объекта супертипа в подтип, когда я вызываю любой метод объекта супертипа, они фактически не вызываются

    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,

Другие вопросы по тегам