객체지향 프로그래밍에서 거의 반드시 등장하는 클래스라는 단어의 의미는 일반적으로 쓰이는 의미(계급, 집단, 집합)와 거의 흡사하다.
일반적인 개념으로 살펴보았을 때, 음식이라는 범주 안에는 고기, 채소, 과일 등등 다양한 것들이 들어갈 수 있다.
그리고 과일 범주 아래에는 배, 사과, 바나나, 감, 오렌지 등이 포함된다.
여기서 배, 사과, 바나나 등은 직접 만질 수도 볼 수도 있는 구체적이고 실존하는 사물에 해당한다.
반면, 음식이나 과일은 어떤 사물들의 공통 속성을 모아 정의한 것일 뿐 만질 수도 볼 수도 없는 추상적 개념이다.
음식은 과일과의 관계에서 상위 개념이고, 과일은 음식과의 관계에서 하위의 개념이다. 이를 그림으로 표현하면 아래와 같다.

위 그림에서와 같이 음식, 과일은 모두 집단, 즉 클래스이다.
음식은 과일보다 상위 클래스(superclass), 과일은 음식보다 하위 클래스(subclass)이다.
이때 과일 분류 하위에 또 다른 분류가 있을 경우에는 클래스 간 관계는 어떻게 될까?

음식은 과일의 superclass, 과일은 음식의 subclass이면서 귤류의 superclass, 귤류는 과일의 subclass이다.
클래스는 하위로 갈수록 상위 클래스의 속성을 상속하면서 더 구체적인 요건이 추가 또는 변경된다.
물론 하위 클래스가 아무리 구체화 되더라도 이들은 결국 추상적인 개념일 뿐이다.
한편 감귤, 자몽, 천혜향 등은 앞의 클래스들의 속성을 지니는, 실제로 먹을 수 있고 만질 수 있는 실존하는 개체이다.
이처럼 어떤 클래스의 속성을 지니는 실존하는 개체를 일컬어 인스턴스(instance) 라고 한다.
현실 세계에서는 개체들이 이미 존재하는 상태에서 이들을 구분짓기 위해 클래스를 도입한다. 이 때문에 하나의 개체가 같은 레벨에 있는 서로 다른 여러 클래스의 인스턴스일 수 있다.

반면 프로그래밍 언어상에서는 접근 방식이 정반대이다.