사진의 코드 참고해주세요. 명품 자바프로그래밍 예제인데,

코드가 잘 이해가 안돼요. 두번째 사진의 // 모든 도형 출력 부분부터 보면, Shape p = start;를 통해
Shape의 레퍼런스 변수 p가 start가 가리키는 레퍼런스를 똑같이 가리키게끔 하여, 변수 p는 위에 지정했던 Line 클래스에서 생성한 객체를 가리킨다는 것 까진 알겠어요.

그래서 처음에 반복문을 실행하면 p.draw();를 통해 p가 가리키는 객체인 Line이 생성한 객체에서 오버라이딩을 통해 업캐스팅이 되었지만 LIne의 draw 메소드가 실행되게 되고,

그 이후가 이해가 안되는데요. p=p.next;를 하게되면 위의 문장에서

맨 마지막에 obj = new Circle(); last.next=obj;를 통해 Shape next 레퍼런스 변수가 가리키는 객체는
Circle에서 생성한 객체로 초기화를 시킨 것이잖아요?

그런데 왜 쌩뚱맞게 Rect에서 생성한 객체를 가리키게 된다는 것인지... 도무지 이해가 안가요.

동시에 저 문장에서 결국 Shape의 레퍼런스 변수는 start, last, obj, next가 되는것인데. 이 중 last의 역할도 모르겠구요. 아마 이거랑 연관이 있는듯 싶은데 이해가 잘 안가네요.

조건문을 왜 사용했는지 조건문의 조건이 p!=null인 것도 이해가 안가네요 ㅠㅠ