/*
 * Father.java	0.1		Jun 15, 2000
 *
 * Copyright (c) 2000 by Yoon Kyung Koo.
 * All rights reserved.
 */


/**
 * Father class
 *     an example that shows inheritance in Java
 * @version  0.1 2000-06-15 14:55:45
 * @author   Yoon Kyung Koo
 */

public class Father {
	String car="LeMans";

	void drive() {
		System.out.println(car);
	} 

	public static void main (String args[]) { 
		Father father=new Father(); 
		Child1 child1=new Child1();
		Child2 child2=new Child2();
		Child3 child3=new Child3();

		/* testing father */
		System.out.println();
		System.out.println("FATHER ---------");

		father.drive();
		// ¹°·Ð ¾Æºü Â÷´Â ¸£¸ÁÀÔ´Ï´Ù.
		System.out.println(father.car);
		// ¾Æºü Â÷´Â ¸£¸ÁÀÔ´Ï´Ù.

		/* testing child1 */
		System.out.println();
		System.out.println("CHILD 1 ---------");

		child1.drive(); 
		// Child1 Ŭ·¡½º¿£ drive() ¸Þ¼Òµå°¡ ¾øÀ¸´Ï±î ºÎ¸ðÀÎ Father Ŭ·¡½ºÀÇ drive()°¡ È£ÃâµÊ.
		// µû¶ó¼­, Father.drive()°¡ ã¾Æº¼ ¶§¿¡´Â Father Ŭ·¡½ºÀÇ car¸¸ º¼ ¼ö ÀÖÀ½.
		// °á±¹ ¸£¸ÁÀ» ÂïÀ½.
		System.out.println(child1.car);
		// ¹°·Ð Child1 Ŭ·¡½º ÀνºÅϽºÀÇ car Çʵå´Â ·¹°£ÀÚÀÓ. ºÎ¸ð °ÍÀº Àڱ⠰Ϳ¡ °¡·ÁÁü (field hide)
		((Father) child1).drive(); 
		// staticÀÌ ¾Æ´Ñ ¸Þ¼Òµå´Â Çü º¯È¯À» ÇÏµç ¾È ÇÏµç »ó°ü¾øÀÌ ¿ø·¡ Çü¿¡ µû¶ó
		// ½ÇÇàµÇ¹Ç·Î child1.drive()¿Í µ¿ÀÏÇÏ´Ù°í »ý°¢ÇÏ¸é µÊ. ¸£¸Á
		System.out.println(((Father)child1).car);  
		// Çüº¯È¯À» ÇßÀ¸¹Ç·Î child1À» Father ŸÀÔ º¯¼ö(ÀÓ½Ã)¿¡ ÀúÀåÇß´Ù°í »ý°¢ÇÏ¸é µË´Ï´Ù
		// Father ŸÀÔ º¯¼öÀ̹ǷΠ¹«Á¶°Ç ¸£¸Á. (Çʵå´Â override °³³äÀÌ ¾ø½À´Ï´Ù.)

		/* testing child2 */
		System.out.println();
		System.out.println("CHILD 2 ---------");

		child2.drive();  
		// Child2 Ŭ·¡½º¿£ drive() ¸Þ¼Òµå°¡ ÀÖÀ¸´Ï±î ±×³É Àڱ⠰ÍÀ» È£Ãâ.
		// µû¶ó¼­ ·¹°£ÀÚ.
		System.out.println(child2.car);
		// ¹°·Ð ·¹°£ÀÚ.  ºÎ¸ð °ÍÀº Àڱ⠰Ϳ¡ °¡·ÁÁü (field hide)
		((Father) child2).drive();
		// child2.drive()¿Í µ¿ÀÏ. ·¹°£ÀÚ
		System.out.println(((Father)child2).car);
		// child2¸¦ Father ŸÀÔ º¯¼ö(ÀÓ½Ã)¿¡ ÀúÀåÇß´Ù°í º¸¸é
		//  Father ŸÀÔ º¯¼öÀ̹ǷΠ¹«Á¶°Ç ¸£¸Á. (Çʵå´Â override °³³äÀÌ ¾ø½À´Ï´Ù.)

		/* testing child3 */
		System.out.println();
		System.out.println("CHILD 3 ---------");

		child3.drive();
		// Child3 Ŭ·¡½º¿£ drive() ¸Þ¼Òµå°¡ ÀÖÀ¸´Ï±î ±×³É Àڱ⠰ÍÀ» È£Ãâ.
		// ÇÏÁö¸¸ Child3 Ŭ·¡½º¿¡´Â car Çʵ尡 ¾øÀ¸¹Ç·Î ºÎ¸ð °ÍÀ» »ó¼ÓÇÏ¿© »ç¿ë. µû¶ó¼­ ¸£¸Á
		System.out.println(child3.car);
		// ¹°·Ð ¸£¸Á (ºÎ¸ð°É »ó¼ÓÇßÀ¸¹Ç·Î)
		((Father) child3).drive();
		// child3.drive()¿Í µ¿ÀÏ
		System.out.println(((Father)child3).car);
		// child3¸¦ Father ŸÀÔ º¯¼ö(ÀÓ½Ã)¿¡ ÀúÀåÇß´Ù°í º¸¸é 
		// Father ŸÀÔ º¯¼öÀ̹ǷΠ¹«Á¶°Ç ¸£¸Á. (Çʵå´Â override °³³äÀÌ ¾ø½À´Ï´Ù.)
	}
}

class Child1 extends Father {
	String car="Leganza";
}

class Child2 extends Father {
	String car="Leganza";

	void drive() {
		System.out.println(car);
	}
}

class Child3 extends Father {
	void drive() {
		System.out.println(car);
	}
}