가장 많이 하는 오해 중 하나가
객체지향 프로그래밍에서 상속을 코드의 재사용을 개념이라 생각합니다.
엄밀히 말해 객체 지향 프로그래밍에서
상속은 코드의 재사용을 위해 사용하는 방법이 아닌,
일반적인(general) 클래스가 이미 구현이 되어 있는 상태에서
그보다 좀더 구체적인(specific) 클래스를 구현하기 위해 사용하는 방법입니다.
( 이 상황에서 상위 클래스의 코드를 하위 클래스가 재사용되지요 )

어떤 백화점이 있고,
그 백화점의 고객이 있다라고 할 때,
고객이 가지는 공통점들이 있지만,
고객의 등급( 매출의 기여도에 따라 VIP, GOLD, SILVER 등등)에 따라
다른 서비스가 제공될 수 있습니다.
할인 쿠폰이라던가 보너스 포인트 지급등이 달라질 수 있지요.

그러한 경우 일반적인 Customer 라는 클래스에서 각각 상속을 받아
VIPCustomer, GoldCustomer등으로 구분하여 구현할 수 있습니다.
회사의 정규직, 계약직, 게임에서의 여러 유닛 등은 서로 같지만,
다른 객체 특징(속성)과 기능들이  존재 할 수 있는데,
이러한 경우도 클래스 간의 상속으로 구현합니다.
상속을 활용하면 유연하고 확장성 있는 프로그램을 만들 수 있습니다.  

여기서 확장성(extensible)이 있고 유연하다(flexible)하다는 것을 예를 들어 설명하면,
가령 고객의 등급이 더 많아진다고 할 때
다른 클래스를 건드리지 않고 Customer를 상속받아
새로운 등급의 고객을 추가할 수 있는 방식 등으로
프로그램에 대한 요청사항이 있을 때 수정이나,
기능추가가 용이하다는 뜻입니다.
( 객체지향 프로그램의 가장 큰 특징이자 장점 중 하나죠 )

이러한 일반적인 클래스와 구체적인 클래스의 관계를
나타내는 의미로 상속을 IS-A 관계라고 합니다. 

이와 다르게 단순히 하나의 클래스가 다른 클래스의 기능이 필요한 경우가 있을 수 있습니다.
그런 경우가 바로 코드의 재사용이 되겠지요.

서로 이질적인 클래스의 관계에서
한 클래스가 다른 클래스의 기능을 사용하여 구현해야 한다면
합성의 방식을 사용합니다.
가령 학생이 수강하는 과목들,
회사원에게 부서정보 등은 상속을 받아 사용하는 클래스의 관계가 아닙니다.
클래스간의 합성관계를 사용하는데,
다른 말로 Has-A 관계라고도 합니다.
이를 코드로 표현하면 주로 클래스의 멤버변수로 선언하고 생성하여 사용합니다.

class Subject{
   private int subjectId;
   private String subjectName;
    …..
}

clsss Student{
   private Subject korean;
   private Subject math;
}

Student 클래스가 Subject 클래스의 기능을 사용할 필요가 있다고 해서
무조건 상속을 받지 않는 다는 것이죠.

객체 지향에서 다른 클래스를 활용하는 기본적인 방법은,
합성을 활용하는 것이 가장 기본적이랍니다.