abstract class Person
{
            // these are abstract methods
            String name;
            abstract String color();
            public abstract Long height();
            public abstract Long weight();

            // abstract class can have constructor
            public Person(String name) {
                        System.out.println("Person constructor called");
                        this. name = name;
            }

            // this is a concrete method
            public String getName() {
                        return name;
            }
}

class Person1 extends Person
{
	String name;
	public Person1(String name) {
		// calling Person constructor
		super(name);
		System.out.println("Person1 constructor called");
		this. name = name;
	}
	
	@Override
	String color() {
		System.out.println("Person1 colour is white");
	}
	
	@Override
	public Long weight() {
		return 65L;
	}
	
	@Override
	public Long height() {
		return 165L;
	}
}

class Person2 extends Person{
	
	String name;
	
	public Person2(String name) {
		// calling Person constructor
		super(name);
		System.out.println("Person2 constructor called");
		this. name = name;
	}
	
	@Override
	public Long weight() {
		return 50L;
	}

	@Override
	public Long height() {
		return 150L;
	}
	
	public class Test
	{
		public static void main(String[] args)
		{
			Person p1 = new Person1("Ram");
			Person p2 = new Person2("Shyam");
			System.out.println(p1.toString());
			System.out.println(p2.toString());
		}
	}
}