2013-10-28 6 views
7

추상 클래스의 객체를 생성 할 수는 없지만 객체가 추상 클래스 인 참조를 여전히 가질 수 있습니다. 당신이있을 때추상 클래스는 어떻게 객체를 참조 할 수 있습니까?

Account anAccount; // OK 
anAccount = new Account(); // Error—Account is abstract 
anAccount = new SavingsAccount(); // OK 
anAccount = null; // OK 
당신이 추상 클래스에 대한 객체 참조를 가질 수있는 이유를 이해하지

...

답변

10

: 물론, 그것을 참조하는 실제 객체는 구상 서브 클래스의 인스턴스 해야합니다 그 타입이 추상 클래스 인 객체 참조는 그 참조가 "나는 추상적 클래스를 참조하고있다"는 것을 의미하지 않는다. 대신, "나는 그 추상 클래스의 서브 클래스 인 실제 객체를 참조하고있다." 따라서 Account의 하위 클래스 인 추상화되지 않은 클래스 인 SavingsAccount을 참조 할 수 있지만 Account을 실제로 인스턴스화 할 수 없으므로 new Account()을 가리킬 수 없습니다.

참조 자체는 추상 클래스의 실제 인스턴스가 아닙니다.

희망이 도움이됩니다.

+0

그렇다면 Account anAccount; 그게 무슨 소리 야? 실제로 아무 것도 가리키고 있지 않습니까? 그것이 추상 클래스가 아니더라도 String tmp라고 말할 수 있습니다. 아직 주소를주지 않았습니까? – user2809437

+0

@ user2809437- 맞습니다. 'Account anAccount'라고 말할 때, 처음에는'null'을 담고있는 anAccount라는 참조를 얻습니다. 이것은 아무것도 가리키고 있지 않다는 것을 의미합니다. 그것은'String tmp'와 동일합니다; 'String'에 대한 참조를 얻었지만 아직'String'을 가리 키도록 지정하지 않았기 때문에'null'을 가리 킵니다. – templatetypedef

+0

질문이 하나 더 있습니다. 어떻게해야할까요? 클래스의 인스턴스를 만들 수 없다면 참조와 함께 둘 다? – user2809437

1

문제는 추상 멤버 루틴을 호출 할 수 없다는 것입니다.
'new'를 호출하면 실제로 클래스의 생성자가 호출됩니다.
추상 멤버 함수를 호출하려고하므로 오류가 발생합니다.

은 추상 클래스를 참조합니다.이 클래스는 파생 된 실제 클래스의 청사진 일 뿐이므로 추상 클래스를 참조합니다. 인터페이스와 비슷하지만 상속이 있습니다.
인터페이스를 인스턴스화 할 수없는 것처럼 추상 클래스를 인스턴스화 할 수 없습니다.

물론 이것은 polymorphism의 일부입니다.
추상 클래스와 인터페이스의 차이는 매우 작습니다. 다음을 참조하십시오. Interface vs Abstract Class (general OO)

관련 문제