Почему Don''t вы пытаетесь код, чтобы увидеть?
- да
- он будет вызывать один в родительском классе
- он будет вызывать один в классе ребенка
- нет.
Дано:
class Parent
{
public void foo()
{
System.out.ptintln("parent::foo");
bar();
}
public void bar()
{
System.out.println("parent::bar");
}
}
class Child
extends Parent
{
public void foo()
{
super.foo();
System.out.ptintln("child::foo");
}
}
Вы можете использовать класс ребенка везде, где используется класс Parent, потому что все дети имеют типы родителей.
Когда компилятор смотрит на этот код:
Parent p = new Child();
он проверяет, что ребенок расширяет или реализует Parent.
Когда компилятор смотрит на этот код:
p.foo();
он проверяет, что тип по p
объявлен как, Parent
, имеет метод foo
.
Во время выполнения, когда p.foo()
линия выполнена виртуальная машина смотрит на тип, который p
фактически указывая на, Child
, и выглядит там для метода foo
. Предполагая, что метод foo
находится в Child
, он запускает его, иначе он смотрит на класс Parent
.
В классе Parent, когда метод foo
вызывает bar
компилятор снова смотрит, чтобы убедиться, что Parent
класс имеет метод bar
. Во время выполнения VM снова обращается к классу Child
для метода bar
, и поскольку он не вызывает его в Parent
.
Если методы не существуют в Parent
, тогда они должны существовать в родительском классе Parent
, вплоть до java.lang.Object
.
Этот вопрос не показывает никаких исследований. Сначала попробуйте, затем спросите позже. –
Я думал, что это интересный вопрос, и люди дали мне хорошие ответы, к сожалению, я удалю его, потому что есть другие, которые считают, что я заслуживаю минус за это. –