2016-06-08 4 views
0

다섯 개 클래스 이렇게 만들어진 가정 :상속 - 왜 수퍼 클래스가 서브 클래스 인스턴스를 상속합니까?

enter image description here

그들은 모두 같이 상속을 통해 접속하고,이 newFruit GoldenDelicious의 인스턴스이고 myOrange 오렌지의 인스턴스이다.

여기 내 질문은 :

  1. 왜 newFruit 매킨토시 애플과 과일의 인스턴스가 아닌 것?
  2. myOrange가 Apple이 아닌 Fruit의 인스턴스가되는 이유는 무엇입니까?

Apple (GoldenDelicious 및 Macintosh)의 모든 하위 클래스는 인스턴스를 갖지만 Apple (Fruit)의 수퍼 클래스는 상속 관계를 이해하지 못합니다. 왜 이것이 사실이 아닌가?

+2

나무가 거꾸로 보입니다. 진지하게. 아래쪽에 "과일"을 그려 보시고 더 이해가되는지 확인하십시오. – dnault

+1

1. I (newFruit)와 같은 이유는 Human (GoldenDelicious)과 Primate (Apple)의 인스턴스이지만 Chimpanzee (Macintosh)의 인스턴스는 아닙니다. 2. 조류 (오렌지)와 영장류 (사과)는 둘 다 동물 (과일)이기 때문에 새는 영장류가 아닙니다. – Gendarme

답변

2

(간단하게하는 인터페이스를 고려하지 않고, 단지 클래스 상속의 이야기) 당신은 그림에서와 같이 상속 트리가있는 경우

, 는 클래스의 인스턴스는 모든 인스턴스 것 부모 노드는 있지만 형제는 없습니다.

Java의 상속이 "is a" relationship이기 때문에. newFruitGoldenDelicious 경우 현실 세계에서

은 다음 그것은 Apple 또한 그것이 Fruit의를합니다. 그러나 GoldenDelicious 개체 Orange이 아닙니다. 이것은 직관적 인 것처럼 보입니다.

+0

나는 모든 하위 클래스가 수퍼 클래스의 인스턴스 (public)를 포함하여 모든 것을 가지고 있다고 가르쳤다. _GoldenDelicious_에서 _newFruit_이 생성되었으므로 _GoldenDelicious_의 모든 하위 클래스에는 _NewFruit_이 있습니다. 이해할 수 있습니다. 지금 내가 알고 싶은 것은 하위 클래스에서 생성 된 무언가가 수퍼 클래스로 돌아가는 이유입니다. "관계"라는 것은 _GoldenDelicious_는 "_Apple_"이지만 _GoldenDelicious_에서 _Apple_에 인스턴스를 다시 전달하는 것과 어떻게 일치합니까? – Slash

+0

'newFruit' *는'GoldenDelicious'의 인스턴스이며 * 차례로 *'Apple', 차례로 *'Fruit'입니다. 따라서,'newFruit'은'GoldenDelicious'에 정의 된 모든 속성과 메소드를 가지고 있습니다. 'GoldenDelicious'는 자체 행동을 정의 할 수 있으며 '사과'의 행동과 '과일'의 행동을 (전적으로) 상속받습니다. 요약하면,'newFruit'은'GoldenDelicious','Apple'','Fruit'에서 정의 된 모든 속성과 메소드를 가지고 있습니다. –

+0

그러나 'GoldenDelicious'의 인스턴스를'Apple' 타입의 변수, 즉''Apple apple = new GoldenDelicious(); ''에 지정하면 모든 추가 속성/메소드를 가진'GoldenDelicious'의 인스턴스가 될 것입니다 (애플과 비교). 하지만이 변수로 이러한 추가 속성/메소드에 ** 액세스 ** 할 수는 없습니다 **. 이 작업을하려면 [downcast] (https://en.wikipedia.org/wiki/Downcasting)해야합니다 :'((GoldenDelicious) apple) .methodOfGolderDelicious()'. –

관련 문제