A a1 = new B(); // 가능
A a2 = new X(); // 가능
A a3 = new C(); // 가능
A a4 = new Y(); // 가능
B b1 = new C(); // 가능
X x1 = new Y(); // 가능
C c = new C(); // 가능
B b2 = c; // 가능
Y y = new Y(); // 가능
X x2 = y; // 가능

Army army1 = new Army();
Unit u = army1;
Army army2 = (Army)u;
Unit u =new Navy();
Navy navy = (Navy)u;
불가능 : 최초 객체 생성이 부모 형태로 만들어진 경우
Unit u = new Unit();
Army army = (Army)u;
불가능 : 최초 생성된 것과 다른 형식으로 변환하는 것을 불가능
Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;
위의 두 경우 모두 문법적인 오류는 없기 때문에 이클립스에서는 에러를 검출하지 못함
하지만 프로그램을 실행시켰을 경우에는 에러가 발생
package boxing;
class Hello {
public void say() {
System.out.println("Hello");
}
}
class Korean extends Hello {
@Override
public void say() {
System.out.println("안녕하세요");
}
public void talk() {
System.out.println("또 만났군요");
}
}
public class Main01 {
public static void main(String[] args) {
Hello k = new Korean(); //암묵적 형변환
k.say();
// Hello에게 정의된 기능이 아니므로 에러
// k.talk();
}
}
package boxing;
public class AirForce extends Unit{
public AirForce(String name) {
super(name);
}
@Override
public void attack () {
super.attack();
System.out.println(super.getName() + " >> 공중 공격 실행");
}
public void bombing() {
System.out.println(super.getName() + " >> 폭격");
}
}
package boxing;
public class Army extends Unit{
public Army(String name) {
super(name);
}
@Override
public void attack () {
super.attack();
System.out.println(super.getName() + " >> 지상 공격 실행!");
}
public void tank() {
System.out.println(super.getName() + " >> 탱크 공격!");
}
}
package boxing;
public class Navy extends Unit{
public Navy(String name) {
super(name);
}
@Override
public void attack () {
super.attack();
System.out.println(super.getName() + " >> 어뢰 발사!");
System.out.println(super.getName() + " >> 지상 상륙");
}
public void nucleus() {
System.out.println(super.getName() + " >> 탱크 공격!");
}
}
package boxing;
public class Unit {
private String name;
public Unit(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void attack () {
System.out.println(this.name + " >> 공격 준비");
}
}
package boxing;
public class Main02 {
public static void main(String[] args) {
AirForce af = new AirForce("공군");
Navy nv = new Navy("해군");
Army am = new Army("육군");
// 각각의 객체는 자신들의 공유 기능을 사용할 수 있음
af.bombing();
nv.nucleus();
am.tank();
System.out.println("-----------");
// 1. 각각의 af, nv, am이라는 객체를 temp1, temp2, temp3라는 이름의 상위 객체로 암묵적 형변환
// 2. temp1, temp2, temp3객체로 attack()이라는 메서드를 각각 호출
Unit temp1 = af;
Unit temp2 = nv;
Unit temp3 = am;
af.attack();
nv.attack();
am.attack();
System.out.println("-----------");
//상위 클래스 형태로 형변환이 되면, 자신들의 독립 기능은 사용하지 못함
// temp1.bombing();
// temp2.nucleus();
// temp3.tank();
//명시적 형변환 다시 원래의 기능을 되돌리기 위해서는 하위 클래스 형태로 명시적 형변환이 필요함
AirForce re1 = (AirForce)temp1;
Navy re2 = (Navy)temp2;
Army re3 = (Army)temp3;
re1.bombing();
re2.nucleus();
re3.tank();
}
}