какая версия метода вызывается при многоуровневом наследовании? - PullRequest
0 голосов
/ 22 июня 2011

СИТУАЦИЯ: Скажем, у меня есть класс A, класс B, который расширяет A, и класс C, который расширяет B.class A имеет метод hello (), который переопределен в классе B.

EVENT: Теперь класс C вызывает hello ().

ВОПРОСЫ: Какая версия будет называться? Я предполагаю, что она будет иметь класс выше в иерархии, т.е. B. В любом случае, как получить доступ к различным версиям hello () из C ?

СВЯЗАННЫЕ ВОПРОСЫ: Используя super, мы можем получить доступ к версии чуть выше в иерархии, но как получить доступ к версиям выше по иерархии? Например, как получить доступ к hello A) из C?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Вы не можете.Только код в B может использовать super для вызова A.hello();и если бы A, B и C были все для реализации hello(), любой код в C не имел бы доступа к A.hello().

В общем случае код в любом классе может вызывать свою собственную версиюметод и версия его непосредственного суперкласса, и все тут.Без сотрудничества суперкласса нет возможности звонить другим.

0 голосов
/ 21 мая 2015

Динамическая диспетчеризация метода Динамическая диспетчеризация метода - это механизм, с помощью которого вызов переопределенного метода разрешается во время выполнения, а не во время компиляции.Динамическая диспетчеризация метода важна, потому что именно так Java реализует полиморфизм во время выполнения.Ссылочная переменная суперкласса может ссылаться на объект подкласса.Java использует этот факт для разрешения вызовов переопределенных методов во время выполнения.Вот как.Когда переопределенный метод вызывается через ссылку на суперкласс, Java определяет, какую версию этого метода выполнить, основываясь на типе объекта, на который ссылаются во время вызова.Таким образом, это определение выполняется во время выполнения.Когда упоминаются разные типы объектов, будут вызываться разные версии переопределенного метода.Другими словами, именно тип объекта, на который ссылаются (а не тип ссылочной переменной), определяет, какая версия переопределенного метода будет выполнена.Следовательно, если суперкласс содержит метод, который переопределяется подклассом, то при обращении к различным типам объектов через ссылочную переменную суперкласса выполняются разные версии метода.

Пример: класс A

{

int a;

void show()
{
    a=10;
    System.out.println("a of A : "+a);
}

}

расширяет класс B A

{

int a;
void show()
{
    a=20;
    System.out.println("a of B : "+a);
}

}

класс Cрасширяет B

{

int a;
void show()

{
    a=30;
    System.out.println("a of C : "+a);
}   

} ​​

класс неоднозначности

{

public static void main(String args[])

{
    A oa = new A();
    B ob = new B();
    C oc = new C();
    A r;//r is superclass reference variable

    r = oa;
    r.show();

    r = ob;
    r.show();

    r = oc;
    r.show();

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...