/*
 * Created on 30.04.2004
 */

/**
 * @author Manuel Grenacher, IB02
 */
public class Overloading {

	public static void main(String[] args) {
		A a1 = new A(), a2 = new B(), a3 = new C();
		B b1 = new B(), b2 = new C();

		System.out.println(a1.getSize(a2));
		System.out.println(a2.getSize(a2));
		System.out.println(a2.getSize(b1));
		System.out.println(b1.getSize(b2));
		System.out.println(b2.getSize(b2));
		System.out.println(a2.getSize());
		System.out.println(b1.getSize());
		System.out.println(b2.getSize());
	}
}

class A{
	int x =2;
	public int getSize(A a){return a.x;}
}
class B extends A{
	static int x = 5;
	public int getSize(A a){return x;}
	public int getSize(B b){return 1 + b.x;}
	public int getSize(C c){return c.getSize();}
	public int getSize(){return 2*getSize(this);}
}

class C extends B{
	public int getSize(B b){return 13;}
	public int getSize(C c){return x+getSize((A)c);}
	public int getSize(){return getSize(this);}
}