/**
 * Demonstrates how overloading works (static/compile-time resolution)
 * with some dynamic dispatch thrown in.
 * 
 * @author CS209
 */ 
public class OverloadPlay {

	public static void staticPrint(Parent parent) {
		System.out.println("Static Parent");
	}

	public static void staticPrint(Child child) {
		System.out.println("Static Child");
	}

	public void instancePrint(Parent parent) {
		System.out.println("Parent");
		parent.method();
	}

	public void instancePrint(Child child) {
		System.out.println("Child");
		child.method();
	}

	public static void main(String[] args) {
		Child child = new Child();
		Parent p = child;

		staticPrint(p);
		new OverloadPlay().instancePrint(p);
	}
}

class Parent {    
    public void method() {
        System.out.println("Called parent's method");   
    }
}

class Child extends Parent {
    public void method() {
        System.out.println("Called child's method");   
    }
}