public class OverloadTest {
	double x, y;

	public OverloadTest(double x0, double y0) {
		x = x0; y = y0;
	}
	public void foo(double dx, double dy) { // foo その1
		x += dx; y += dy;
	}
	public void foo(int dx, int dy) {	// foo その2
		x *= dx; y *= dy;
	}

	public void bar(Point p) {  	        // bar その1
		System.out.print("Point class: ");
		p.print();
		System.out.println();
	}

	public void bar(ColorPoint p) {         // bar その2
		System.out.print("ColorPoint class: ");
		p.print();
		System.out.println();
	}

	public void print() {
		System.out.printf("(%g, %g)", x, y);
		System.out.println();
	}

	public static void main(String[] args)	{
		OverloadTest o = new OverloadTest(1.1, 2.2);
		o.foo(3.3, 4.4); // foo その1が呼ばれる
		o.print();
		o.foo(2, 3);     // foo その2が呼ばれる
		o.print();

		ColorPoint cp = new ColorPoint(0, 0, "red");
		Point p = cp;
		o.bar(cp);       // bar その2が呼ばれる
		o.bar(p);        // bar その1が呼ばれる
	}
}
