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が呼ばれる
  }
}
