Dispatching in Java public class A public class

Dispatching in Java public class A { } public class Sub. A extends A{ } public class B { public void talk. To(A super. A) { System. out. println("B talks to super. A"); } public void talk. To(Sub. A derived. A) { System. out. println("B talks to derived. A"); } } public class Sub. B extends B { public void talk. To(A super. A) { System. out. println("Sub. B talks to super. A"); } public void talk. To(Sub. A derived. A) { System. out. println("Sub. B talks to derived. A"); } } 2/23/2021 Good Java Programming 1

Driver code B b 1 = new B(); B sub. B 2 = new Sub. B(); A a 1 = new A(); A sub. A 2 = new Sub. A(); b 1. talk. To(a 1); b 1. talk. To(sub. A 2); sub. B 2. talk. To(a 1); sub. B 2. talk. To(sub. A 2); 2/23/2021 Good Java Programming 2

Driver code: another look B b 1 = new B(); B sub. B 2 = new Sub. B(); A a 1 = new A(); A sub. A 2 = new Sub. A(); b 1. talk. To(a 1); // reference is superclass and argument is superclass b 1. talk. To(sub. A 2); // reference is superclass and argument is subclass? sub. B 2. talk. To(a 1); // reference is subclass and argument is superclass sub. B 2. talk. To(sub. A 2); // reference is subclass and argument is subclass? 2/23/2021 Good Java Programming 3
![Output // Expected output is the following? [java] B talks to super. A [java] Output // Expected output is the following? [java] B talks to super. A [java]](http://slidetodoc.com/presentation_image_h/0b2981d501636eeb9fcd4c4e051de316/image-4.jpg)
Output // Expected output is the following? [java] B talks to super. A [java] B talks to derived. A [java] Sub. B talks to super. A [java] Sub. B talks to derived. A // The output is the following: [java] B talks to super. A [java] Sub. B talks to super. A 2/23/2021 Good Java Programming 4

Driver code: another look B b 1 = new B(); B sub. B 2 = new Sub. B(); A a 1 = new A(); A sub. A 2 = new Sub. A(); b 1. talk. To(a 1); // reference is superclass and argument is superclass b 1. talk. To(sub. A 2); // reference is superclass and argument is Superclass type at compile time sub. B 2. talk. To(a 1); // reference is subclass and argument is superclass sub. B 2. talk. To(sub. A 2); // reference is subclass and argument is Superclass type at compile time. 2/23/2021 Good Java Programming 5

Forcing Two Single Dispatches public class DD_A { public void talk. To(DD_B super. B) { super. B. talk. To(this); } } public class DD_Sub. A extends DD_A{ public void talk. To(DD_B super. B) { super. B. talk. To(this); } Good Java Programming } 2/23/2021 6

Forcing Two Single Dispatches public class DD_B { public void talk. To(DD_A super. A) { System. out. println("DD_B talks to super. A"); } public void talk. To(DD_Sub. A derived. A) { System. out. println("DD_B talks to derived. A"); } } public class DD_Sub. B extends DD_B { public void talk. To(DD_A super. A) { System. out. println("Sub. B talks to super. A"); } public void talk. To(DD_Sub. A derived. A) { System. out. println("Sub. B talks to derived. A"); } } 2/23/2021 Good Java Programming 7

Driver Code DD_B dd_b 1 = new DD_B(); DD_B dd_sub. B 2 = new DD_Sub. B(); DD_A dd_a 1 = new DD_A(); DD_A dd_sub. A 2 = new DD_Sub. A(); dd_a 1. talk. To(dd_b 1); dd_a 1. talk. To(dd_sub. B 2); dd_sub. A 2. talk. To(dd_b 1); dd_sub. A 2. talk. To(dd_sub. B 2); 2/23/2021 Good Java Programming 8
![Output [java] DD_B talks to super. A [java] Sub. B talks to super. A Output [java] DD_B talks to super. A [java] Sub. B talks to super. A](http://slidetodoc.com/presentation_image_h/0b2981d501636eeb9fcd4c4e051de316/image-9.jpg)
Output [java] DD_B talks to super. A [java] Sub. B talks to super. A [java] DD_B talks to derived. A [java] Sub. B talks to derived. A 2/23/2021 Good Java Programming 9

Design Guideline Dynamic method dispatch in Java § The method invocation depends on the dynamic type of a single object, which is the object on which the method is invoked § Java uses single dispatch. § Statically dispatches on the non-receiver argument 2/23/2021 Good Java Programming 10
- Slides: 10