<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">class Base { }
class Derived extends Base{ }
class Other { }
// remember, overloading happens at compile time
public class Overload {
	public void m (Base b) {
		System.out.println("Overload.m(Base)");
	}
	
	public void m (Derived d) {
		System.out.println("Overload.m(Derived)");
	}

	public void m (Other o) {
		System.out.println("Overload.m(Other)");
	}	
	
	public static void main(String[] args) {
		Overload t = new Overload();	// Reference Type		Actual Type
		Base b = new Base();	// Base					Base
		Base d = new Derived(); // Base					Derived
		Other o = new Other();
		Derived x = new Derived();
		
					// At Compile-Time:     At Run-Time:
		t.m(b);		// Overload.m(Base)		Overload.m(Base)
		t.m(d);		// Overload.m(Base)		Overload.m(Base)
		t.m(o);		// Overload.m(Other)		Overload.m(Other)
		t.m(x);		// Overload.m(Derived)		Overload.m(Derived)

	}
}
</pre></body></html>