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)
	}
}