객체지향의 특징으로는 재사용이 있다. 그래서 상속을 하면 상위 클래스의 구현된 기능을 재사용할 수 있기 때문에 재사용을 쉽게 할 수 있다. 하지만 상속을 사용할 경우 몇가지 문제가 있다.

상속을 사용하여 Controller의 기능을 확장하고 있다. 하지만 변경의 유연함이라는 측면에서 치명적인 단점을 갖는다.
상속은 상위 클래스의 변경을 어렵게 만든다. 상위 클래스가 변경되면 하위 클래스도 영향을 받게 된다. 만약 AbstractController 의 메소드 변경이 일어난다면 하위 클래스들 모두 영향을 받게 된다. 클래스 계층도가 커질수록 상위 클래스를 변경하는 것은 점점 어려워진다.
유사한 기능을 확장하는 과정에서 클래스의 개수가 불필요하게 증가할 수 있다. 추가적인 요구사항이 들어왔을 때 계층도가 점점 커지게 된다. 자바에서는 단일 상속만 되기 때문에 필요한 조합이 늘어날수록 상속을 통한 기능 재사용을 하면 클래스의 개수가 증가된다
상속 자체를 잘못 사용할 수 있다.
public class Box extends ArrayList<Integer> {
public void put(int some) {
super.add(some + 2);
}
}
위와 같이 ArrayList를 상속하여 Box에 무엇인가를 담는 기능을 확장하였다. 시간이 지나 다른 개발자가 put() 메서드 대신 ArrayList의 add() 메서드를 사용하면 버그가 발생한다. 잘못 사용한 개발자의 문제일 수도 있지만 애초에 오해할 수 있도록 만든 개발자의 문제이다.
상속은 IS-A 관계가 성립해야 하는데 박스는 ArrayList가 될 수 없다.(서로 다른 책임을 가지고 있다.)
같은 종류가 아닌 클래스의 구현을 재사용하기 위해 상속을 받게되면 잘못된 사용으로 이어질 수 있다.