Najważniejsza różnica to między statycznymi i dynamicznymi typami obiektów oraz odniesieniami do obiektów.
Powiedz, że B rozszerza A i C, rozszerza B.
Dynamiczny typ obiektu (typ używany w nowym) jest faktycznym typem środowiska wykonawczego: określa rzeczywiste metody obecne dla obiektu.
Statyczny typ odwołania do obiektu (zmienna) jest typem kompilacji: definiuje lub raczej deklaruje, które metody można wywołać na obiekcie, do którego odnosi się zmienna.
Statyczny typ zmiennej powinien być zawsze tego samego typu lub nadtypem dynamicznego typu obiektu, do którego się odnosi.
Tak więc w naszym przykładzie, zmienna ze statycznym typu A mogą odwoływać obiektów z dynamicznym typu A, B i C. zmiennej ze statycznym typu B może odwoływać obiektów z dynamicznym typu B i C. zmiennej z typem statycznym C może odwoływać się tylko do obiektów z dynamicznym typem C.
Wreszcie, wywołanie metody na odwołaniu do obiektu jest subtelną i złożoną interakcją między typami statycznymi i dynamicznymi. (Przeczytaj specyfikację języka Java na temat wywoływania metody, jeśli mi nie wierzysz.)
Jeśli zarówno A, jak i B realizują na przykład metodę f(), a typ statyczny to A, a typ dynamiczny to C dla metoda a inwokacja, potem Bf() zostanie wywołany:
B extends A, C extends B
public A.f() {}
public B.f() {}
A x = new C(); // static type A, dynamic type C
x.f(); // B.f() invoked
Uproszczenie znacznie: najpierw statyczne typów zarówno odbiornika (typ a) i argumentów (bez args) są wykorzystywane do decydowania o najlepszym dopasowaniu (najbardziej specyficzny) podpis metody dla tego konkretnego wywołania, i to jest wykonywane podczas kompilacji. Tutaj jest to wyraźnie A.f().
Następnie, w drugim kroku w czasie wykonywania, typ dynamiczny służy do zlokalizowania rzeczywistej implementacji naszego podpisu metody. Zaczynamy od typu C, ale nie znajdujemy implementacji f(), więc przechodzimy do B, a tam mamy metodę B.f(), która pasuje do sygnatury A.f(). Zatem wywoływana jest funkcja B.f().
W naszym przykładzie mówimy, że metoda B.f() przesłania metodę A.f(). Mechanizm nadpisywania metod w hierarchii typów nazywany jest polimorfizmem podtypu.
bardzo dobrze wyjaśnione !! – Rohit