Definition
Zum Begriff "Attribut" gibt es leider keine einheitliche Definition.
In Lahres et al. [1] finden wir den Satz: "Neben seiner Funktionalität und den Beziehungen zu anderen Objekten hat ein Objekt Attribute - Eigenschaften -, die das Objekt beschreiben, und Daten, die das Objekt verwaltet."
In dem Buch findet man auch folgende Unterscheidung:
- Daten sind Informationen, die ein Objekt dauerhaft in Variablen speichert. In Java bezeichnet man diese Variablen als Instanzvariablen oder Datenfelder.
- Attribute dagegen sind die von außen beobachtbaren Eigenschaften eines Objektes. Sie können direkt aus den Datenfeldern übernommen oder aus diesen berechnet werden.
Barnes und Kölling [2] setzen Attribute mit Datenfeldern gleich, so sind hier die Variablen xPosition und yPosition die Attribute eines Circle-Objektes.
Kecher et al. [4] wiederum sagen: "Attribute (engl. Attributes) stellen strukturelle Eigenschaften einer Klasse dar."
Wegen dieser Unklarheiten habe ich ChatGPT einmal den Auftrag gegeben, eine statistische Auswertung zu machen, welcher der drei Fachbegriffe "Attribut", "Datenfeld" und "Instanzvariable" in der Fachliteratur und im Internet am häufigsten und in welchem Kontext verwendet wird. Hier das Ergebnis der Recherche:
ChatGPT-Recherche
Ich habe typische Quellen wie Wikipedia, Fachartikel und PDFs zur Informatikterminologie ausgewertet:
- Der Begriff "Attribut" liegt in UML- und OOP‑Kontexten auf dem Niveau der Modellierung sehr weit vorn. In UML‑Beschreibungen ist er der standardmäßige Fachbegriff.
- In deutschsprachigen OOP-Einführungen (z. B. Python, Java) taucht "Instanzvariable" oder neutraler "Feld" häufig auf, während "Attribut" teils synonym verwendet wird.
- In Datenbank- und Statistik-Kontexten wird oft von "Datenfeld" (bei Datensätzen) oder "Attribut" (z. B. in relationalen Modellen) gesprochen.
Demnach dominiert der Begriff "Attribut" im Modellierungs- und UML-Kontext, während im programmiersprachlichen Kontext eher die Begriffe "Instanzvariable" und "Datenfeld" verwendet werden. Auf den Seiten meiner Homepage, zumindest hier im OOP-Kurs, werde ich auch hauptsächlich von Instanzvariablen reden, wenn ich diejenigen Variablen meine, die direkt im Kopf der Klassendefinition deklariert werden:
class Person { String name, vorname; // Instanzvariablen int alter; // Instanzvariablen ... }
Beispiele
Beispiel 1:
In dem Buch von Kecher et al. [4] finden wir eine erweiterte Fassung des Attribut-Begriffs. In seinem Beispiel "Gast" werden u.a. folgende Attribute der Klasse Gast vorgestellt:
+ MIN: double = 200.0 // eine Konstante, nicht veränderbar + betrag: double // eine normale Instanzvariable - hunger: boolean // eine normale Instanzvariable - freunde: String[] [1..10] // ein Array als Instanzvariable + /freundeEinladen: boolean = (betrag > MIN) // eine Methode
Man beachte, dass dies kein Java-Quelltext ist, sondern eine UML-Notation, die eine "etwas" andere Syntax hat als Java. Das Symbol '+' steht für public, das Symbol '-' für private, und das Zeichen '/' für ein Attribut, das aus Instanzvariablen berechnet werden muss.
Interessant ist hier, dass eine sondierende Methode als Attribut gewertet wird. Damit soll wohl ausgedrückt werden, dass sich Attribute von Instanzvariablen dadurch unterscheiden, dass Attribute auch aus Instanzvariablen berechnet werden können.
Als Instanzvariablen könnte man in diesem Beispiel eigentlich nur betrag, hunger und freunde bezeichnen. MIN ist eine Konstante, die für die ganze Klasse gilt, und freundeEinladen ist im Grunde eine sondierende Methode und keine Instanzvariable.
Beispiel 2 (einfacher):
Eine Klasse Kreis besitzt drei private Instanzvariablen - xPosition, yPosition und radius sowie je drei dazu passende Getter- und Setter-Methoden. Die Getter-Methoden liefern die Attribute X-Position, Y-Position und Radius zurück. Achten Sie hier auf die Schreibweise. Ich habe die Attribute bzw. Eigenschaften der Objekte anders geschrieben als die zugrunde liegenden Instanzvariablen, um den Unterschied deutlich zu machen.
Neben diesen drei Attributen, die direkt durch Instanzvariablen realisiert werden, könnte man sich weitere Attribute denken, die aus den Instanzvariablen erst berechnet werden müssen, beispielsweise Umfang und Fläche des Kreises. Nach [4] würde man hier auch von Attributen sprechen, obwohl Umfang und Fläche erst von einer sondierenden Methode (Getter-Methoden getUmfang() bzw. getFlaeche()) berechnet werden müssten. In der UML-Notation würde man dann schreiben:
- xPosition: int - yPosition: int - radius: int + /umfang: double = {2 * 3.14 * radius} + /flaeche: double = {3.14 * radius * radius}
Instanz- und Klassenattribute
Laut [4] definieren Instanzattribute "den Zustand von aus dieser Klasse gebildeten Objekten zur Laufzeit". Klassenattribute dagegen "sind für alle Objekte der Klasse nur genau einmal und unabhängig von der Instanziierung von Objekten vorhanden"
Im ersten Beispiel ist
+MIN: double = 200
ein solches Klassenattribut. In Java und verwandten Programmiersprachen würde man dann einfach von Konstanten sprechen, die für alle Objekte der Klasse gleich sind.
Instanzattribute sind Variablen, die an eine bestimmte Instanz (also an ein konkretes Objekt) einer Klasse gebunden sind. Die Summe der Instanzattribute bestimmt den Status eines Objektes.
Klassenattribute sind Attribute, die nicht an ein einzelnes Objekt gebunden sind, sondern an die Klasse selbst. Der Zugriff erfolgt über Klassenname.Attributname. Ein Beispiel für eine Konstante als Klassenattribut ist Color.BLACK.
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
- Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
- Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
- Kecher et al.: UML 2.5 - Das umfassende Handbuch, Rheinwerk Computing 2021