/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Demo040401_Car {
	String color;//차량 색상
	int door;//문 갯수
	Demo040401_Car(){
		this(null,0);//기본 생성자가 매개변수를 보유한 생성자 호출
	}

	public Demo040401_Car(String color, int door) {
		this.color=color;//매개변수를 인스턴스 전역변수에 넣어줍니다.
		this.door=door;
	}
	
	public void drive(){//시동 부르릉
		System.out.println("brrrrrr~~~");
	}
	public void stop(){//멈춤 삐삐!!
		System.out.println("장비를 정지합니다. 어? 안돼잖아??????");
	}
	public void overriding(){//부모 메소드를 오버라이딩합니다.
		System.out.println("Car Overriding");
	}
}
class Demo040401_FireEngine extends Demo040401_Car {
	
	public Demo040401_FireEngine() {
		this(null,0);//기본생성자가 매개변수를 보유한 생성자를 호출
		
	}
	
	public Demo040401_FireEngine(String color, int door) {
		super(color, door);//자식 객체는 부모객체에게 매개변수를 제공
		
	}
	public void water(){//불이났습니다 물뿌려주세요
		System.out.println("야 꺼 불꺼! 불이야 불! 도와주세요!");
	}
	
	public void overriding(){//부모의 메소드를 오버라이딩합니다.
		System.out.println("Fire Overriding");
	}
	public void Caroverriding(){
		super.overriding();//오버라이딩한 메소드의 부모 메소드를 호출합니다.
	}
	
}

class Demo040401_Main {

	public static void main(String[] args) {
		
		Demo040401_Car car = null;
		//부모타입변수 = null
		Demo040401_FireEngine f1= new Demo040401_FireEngine();
		//자식타입변수 = 자식객체
		Demo040401_FireEngine f2= null;
		//자식타입변수 = null
		
		f1.water();
		car= f1;
		//부모타입변수 = 자식타입객체
		//car.water(); 부모는 자식의 메소드가 없기때문에 사용할수없다
		f2=(Demo040401_FireEngine)car;
		//자식타입변수 = (자식타입형변환)부모타입객체
		f2.water();
		
		//오버라이딩의 다형성
		f1.overriding();//자식의 메소드를 호출
		car.overriding();//자식의 메소드를 호출
		f2.overriding();//자식의 메소드를 호출
		f1.Caroverriding();//super를 사용한 부모의 메소드를 강제 호출
		
		
	}

}