#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.