여러 가지 형태를 가질 수 있는 능력이란 뜻이며, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다. 더 자세히 말하면, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이다.
Keyboard와 NeonKeyboard는 서로 상속관계에 있으며 Keyboard는 조상 클래스, NeonKeyboard는 자손클래스이다. 참조 변수 k 에는 키보드 객체의 주소 값이 담겨 있으며, 참조 변수N에는 네온키보드의 값이 담겨있다. 이처럼 참조변수와 인스턴스의 타입이 일치하는 것이 보통이다.
이번엔 서로 상속관계에있는 두 클래스에서 조상 클래스의 타입의 참조변수로 자손클래스를 참조해보자.
Keyboard(조상 클래스)참조변수 K에 NeonKeyboard(자손클래스)의 객체 주소값을 넣으면 어떻게 될까?
위 사진처럼 NeonKeyboard의 인스턴스를 동일하게 가지지만 NeonColor,Neon의 멤버변수가 조상클래스에는 없기 때문에 해당 빨간 x에 있는 메모리는 사용할 수 없게된다.
반대로 자손타입의 참조 변수에 조상객체의 주소를 집어넣으면 어떻게 될까?
위와 같이 에러가 뜬다. 이유가 뭘까?
인스턴스 Keyboard의 멤버 개수는 4개이고 참조변수 N의 멤버 개수는 6개다. 참조변수N이 사용할 수 있는 멤버 개수가 더 많다. 그래서 에러가 발생한다.
Keyboard에는 NeonSwitch()를 사용할 변수가 없기 때문에 문제가 발생한다.
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다. 클래스는 상속을 통해서 확장은 될 수 있어도 축소는 할 수 없다. 조상 인스턴스의 멤버 개수는 자손 인스턴스의 멤버 개수보다 항상 적거나 같다.
모든 참조변수는 null 또는 4byte의 주소값이 저장되며, 참조변수의 타입은 참조할 수 있는 객체의 종류와 사용할 수 있는 멤버의 수를 결정한다. 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다. 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.