Что здесь произошло внутри?

#java #oop

#java #ооп

Вопрос:

 class A
{
    int i=10;
    void show()
    {
        System.out.println("show()");
    }
}

class B extends A
{
    int j=20;
    void show1()
    {
        System.out.println("show1()");
    }
    public static void main(String ar[])
    {
        A a1=new B();//What happened internally here.please give me answer.
        a1.show();
        a1.show1();
    }
}
  

Комментарии:

1. Не могли бы вы попытаться быть более конкретным, пожалуйста? Ваш вопрос очень широкий и расплывчатый.

2. Чтобы понять это, вы должны сначала узнать, что такое объектная ориентация и ПОЛИМОРФИЗМ.

3. @user: Пожалуйста, объясните, что вы подразумеваете под «внутренне»? Вы имеете в виду байт-код JVM? Вы имеете в виду интерпретатор? Вы имеете в виду сборщик мусора? Вы имеете в виду компилятор?

Ответ №1:

 A a1=new B();//What happened internally here.please give me answer.
a1.show();
a1.show1();
  

Что произошло, так это то, что вы создали экземпляр B и присвоили ссылку на переменную типа A . Это нормально, потому что B экземпляр является A .

В следующей строке вы вызвали один из A методов в B экземпляре. Все в порядке.

В последней строке вы попытались вызвать B метод. Но поскольку статический тип a1 is A , это приводит к ошибке компиляции. Однако, если бы вы написали следующее, оно бы скомпилировалось и работало просто отлично.

 ((B) a1).show1();
  

Если это не отвечает на ваш вопрос, пожалуйста, перефразируйте его, чтобы мы могли лучше его понять.

Ответ №2:

Случилось так, что вы не должны были вызывать:

 a1.show1();
  

потому что, даже если тип экземпляра a1 равен B (new B()), вы обрабатываете его как объект A, для которого не определен метод show1.