Jede Klasse beschreibt genau die Eigenschaften all derjenigen Objekte die eben dieser Beschreibung gemäß aus ihr hervorgehen würden.
Solche Klassen aus denen tatsächlich Objekte werden konkrete Klassen genannt. Als abstrakte Klassen bezeichnet man hingegen solche Klassen aus keine Objekte hervorgehen.
Das führt zu der Frage welchen eine Klasse haben kann wenn von vornherein steht dass aus ihr keine Objekte hervorgehen.
Die Antwort: Sinn macht das dann die in der objektorientierten Programmierung üblichen Vererbungsmechanismen ausgenutzt werden. Denn wenn nebeneinander verwandte existieren deren Attribute/Methoden eine verwandtschaftsbedingte (!) Schnittmenge haben dann gebietet es die Vernunft Schnittmenge in einer gemeinsamen Oberklasse zu definieren. diese Oberklasse wirklich ausschließlich zu dem Zweck wird die verwandtschaftsbedingte Schnittmenge der Attribute/Methoden zu und weiter zu vererben gehen aus ihr eigenen Objekte hervor sie ist also eine Klasse. Für den Fall dass sicherheitshalber verhindert soll zu einer als abstrakt vorgesehenen Klasse doch Objekte zu erzeugen verfügen Programmiersprachen über das (evtl.versehentliche) Erzeugen von Objekten zu unterbinden. Attribute/Methoden die sich nur zufällig gleichen nicht verwandtschaftsbedingt dürfen natürlich nicht in die Oberklasse übernommen werden das ein schwerer Entwurfsfehler.)
Beispiel: Die Leitung eines Bauernhofs mag den Viehbestand (Rinder und Schweine) objektorientiert zu Das wird zunächst zu einer Programmstruktur mit Klassen führen Klasse "Rind" und Klasse "Schwein". der Klasse "Rind" wird später für jedes Rind genau ein Objekt mit den Individualdaten Körpermasse Milchleistung usw.) erzeugt und genauso auch der Klasse "Schwein" je gehaltenem Tier genau zugehöriges Objekt.
Wenn man es bei dieser Programmstruktur dann wird sich die Unschönheit ergeben dass Reihe gleicher Attributdefinitionen in beiden Klassen nebeneinander werden müssen hier beispielsweise das Alter des und die Körpermasse.
In solchem Fall bietet es sich zusätzlich zu den Klassen "Rind" und "Schwein" Oberklasse "Tier" einzurichten die genau all diese enthält die ansonsten in beiden Unterklassen getrennt werden müssten hier also die Attribute "Alter" usw. Das ist deshalb entwurfstechnisch geboten weil Arbeit spart Redundanz vermeidet und somit die der Fehlermöglichkeiten verringert.
Die beiden konkreten Klassen "Rind" und werden dann so geschrieben dass sie jeweils der Oberklasse "Tier" sind. Damit erhalten sie den dort gepflegten Attributesatz. In der konkreten wird der Attributesatz um artspezifische Attribute erweitert Rind also z.B. um das Attribut "Milchleistung". für die Attribute Gesagte gilt natürlich genau für die Methoden: Auch hier werden diejenigen zur (verwandtschaftshierarchiebedingten!) Schnittmenge gehören in die Oberklasse
Und nun ist genau der Effekt von dem oben die Rede war: Sämtliche die wir jemals haben werden gehen ausnahmslos den konkreten Klassen "Rind" und "Schwein" hervor. haben wir aber aus programmorganisatorischen Gründen eine "Tier" geschaffen von der wir gewiss niemals Objekte bilden werden - die würden hier Sinn machen. Damit bleibt hier die Klasse ohne Objekte ist also eine abstrakte Klasse.