import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; public class Main { public static void main(String[] args) { B bAsB = new B(); A bAsA = new B(); C cAsC = new C(); A cAsA = new C(); JButton jButton = new JButton(); JComponent jComponent = new JButton(); JPanel jPanel = new JPanel(); // Overloading bAsB.foo(jComponent); // Runs child's foo(jComponent) bAsB.foo(jButton); // Runs child's foo(jButton) bAsB.foo(jPanel); // Runs child's foo(jComponent) - best match cAsC.foo(jComponent); // Runs child's foo(jComponent) cAsC.foo(jButton); // Runs parent's foo(jButton) - exact match in parent cAsC.foo(jPanel); // Runs child's foo(jComponent) - best match // Polymorphism, in all but the 5th statement below bAsA.foo(jComponent); // Runs child's foo(jComponent) bAsA.foo(jButton); // Runs child's foo(jButton) bAsA.foo(jPanel); // Runs child's foo(jComponent) cAsA.foo(jComponent); // Runs child's foo(jComponent) cAsA.foo(jButton); // Runs parent's foo(jButton) - exact match in parent cAsA.foo(jPanel); // Runs child's foo(jComponent) } }