SnowTire 객체 (자식)을 생성했고,
Tire 타입의 tire 부모 변수에 이 SnowTire객체를 대입했다.
그리고 snowTire변수가 참조하는 객체인 SnowTire객체의 메소드 run() 실행
그리고 tire 변수에 snowTire변수를 대입함으로써 이 tire변수가 참조하는 객체인 SnowTire객체의 메소드 run() 실행
Public class Controll{
public MemberService service;
public void setService(MemberService service) {
this.service = service;
}
}
Controll controller = new Controller();
controller.setService(_____________________________);
① new Service() ( X )
② new MemberService() ( O )
③ new Aservice() ( O )
④ new Bservice() ( O )
⑤ new Boardservice() ( X )
⑥ new Dservice() ( X )
(setService()의 매개타입은 MemberService고, 이어서 필드값이 변경된다. 첫번째 출력 과정은 매개값에 MemberService 객체가 사용되고 있으므로, 타입 변환이 일어나지 않는다. 반면 두번째 출력 과정에서는 MemberService의 자식 객체인 AService가 매개값으로 들어가 있기 때문에 부모클래스 타입으로 자동 타입 변환이 일어난다. 이 때, 부모 클래스의 메소드 login()은 자식 클래스에서 메소드 재정의가 되고 있다. 자동 타입 변환될 때 재정의된 메소드를 이용하게 되므로, AService클래스의 login()메소드를 실행하게 된다.)