# Objekt (Programmierung)

Ein Objekt in der Programmierung bezeichnet eine inhaltlich zusammengehörige Datenmenge:
* In der objektorientierten Programmierung wird eine Objektinstanz aus einer Klasse erzeugt und weist zur Laufzeit einen Datentyp auf. Zur Laufzeit wird dem „Objekt“ Speicher reserviert, in dem seine Daten und Methoden gespeichert werden.
* In anderen (nicht-objektorientierten) Programmiersprachen wie C werden mitunter reservierte Speicherbereiche als „Objekte“ bezeichnet (siehe auch virtuelle Speicherverwaltung).
* Im Semantic Web sind „Objekte“ grundlegende Ressourcen, auf die über das Internet zugegriffen werden kann.

## Objektorientierte Programmierung
### Eigenschaften

Jedes Objekt hat einen Zustand, ein Verhalten und eine Identität. Der Zustand des Objektes setzt sich aus seinen Eigenschaften (Attribute) und Verbindungen zu anderen Objekten zusammen. Das Verhalten des Objektes wird durch die Menge seiner Methoden beschrieben. Die Identität unterscheidet ein Objekt von anderen Objekten, auch wenn diese anderen Objekte den gleichen Zustand und das gleiche Verhalten haben.
In den meisten objektorientierten Programmiersprachen wird ein Objekt oder Exemplar (auch Instanz genannt) aus einer Klasse erzeugt, mittels Konstruktion (siehe auch Konstruktoren und Destruktoren). Diese Instanz besitzt dann zur Laufzeit ihren eigenen Datentyp, eigene Eigenschaften und Methoden. In manchen OOP-Sprachen werden Objekte stattdessen dadurch erzeugt, dass von einem bereits vorhandenen Objekt eine Kopie erzeugt wird; die Kopie kann um weitere Attribute und Methoden erweitert werden. Meist besitzen diese Sprachen kein Klassenkonzept. Objekte ohne Vorlage können dann auch direkt angelegt werden. In Lua beispielsweise kann eine „Tabelle“ angelegt werden, die unterschiedliche Elemente in Form von Werten mit einfachen Datentypen, von Funktionen, oder auch wieder neuen „Tabellen“ enthalten.

### Instanziierung

Als Instanziierung bezeichnet man in der objektorientierten Programmierung das Erzeugen eines konkreten Objekts einer bestimmten Klasse bzw. das Erzeugen einer Kopie eines anderen, existierenden Objekts. Während der Instanziierung eines Objekts wird in vielen Programmiersprachen ein sogenannter Konstruktor ausgeführt.
Die Instanz einer Klasse ist ein konkretes Exemplar mit konkreten Ausprägungen, mit dem bis zu dessen Zerstörung gearbeitet werden kann. Zum Beispiel könnte es in einem Programm, das mit Autos arbeitet (beispielsweise eine Shopsoftware), eine Klasse „Auto“ geben, in der möglichst abstrakt beschrieben wird, welche Eigenschaften ein Auto hat. Wenn in einem solchen Programm ein konkretes Auto, zum Beispiel „Porsche, schwarz, Fahrzeugnummer 42“, erstellt wird, das dann dem Programm zur weiteren Verwendung zur Verfügung steht, so nennt man dieses nun eine Instanz der Klasse „Auto“, und der Vorgang der Objekterstellung heißt Instanziierung.

### Herkunft des Begriffs Instanz

Es gibt die Annahme, dass der heutige Sprachgebrauch „Ein Objekt ist eine Instanz einer Klasse“ auf einer Fehlübersetzung der englischen Bezeichnung „instance“ = „Beispiel“, „Auftreten“ oder „Fall“ beruht. Als Begründung dient die Beobachtung, dass Instanzen im juristischen Kontext zueinander immer in einem über- oder untergeordneten Verhältnis liegen. Diese Annahme wird jedoch von Kritikern als falsch bezeichnet: Die lateinische Wurzel „instantia“ = „das Daraufbestehen“ enthält keine solche Hierarchie von Instanzen untereinander. Vielmehr müssen Instanzen auf anderen Dingen bestehen, was Exemplare von Klassen tun (sie bestehen auf Klassen oder genauer, sie werden in der Programmierung zur Laufzeit aus einer Klasse erzeugt). Auch Goethe nutzte den Begriff „Instanz“ schon in der Bedeutung „Exemplar“: „Eine Instanz aus dem Tierreich der niedrigsten Stufe führen wir noch zu mehrerer Anleitung hier vor.“

### Beispiel

Der Objekttyp (die Klasse) „Buch“ mit der identifizierenden Eigenschaft „Inventarnummer“ (im Falle einer Bibliothek und als einzelne Instanz) enthält die zugehörigen Eigenschaften (Inventarnummer, Ausleihstatus, Beschaffungsdatum, …) und die Beschreibung zur Bearbeitung der Eigenschaften (die Methoden, wie z. B. die Veränderung des Ausleihstatus im Falle einer Ausleihe durch einen Kunden).
Ein Objekt ist dann eine reale Ausprägung der Klasse, also ein bestimmtes Buch, wie z. B. mit der Inventarnummer 4711. Objektorientierte Programmiersprachen erlauben die gleichzeitige Koexistenz verschiedener Objekte, etwa ein Buch mit der Nummer 4711 und eines mit der Nummer 1234.

### Unterschied zwischen Entität und Objekt

Der Begriff Objekt ist in der Programmierung mit dem Begriff Entität verwandt.
Die Begriffe Entität und Entitätstyp werden bei der Datenmodellierung, z. B. beim ER-Modell verwendet. Entitätstypen besitzen Attribute, aber keine Methoden.
Die Begriffe Objekt und Klasse kommen hingegen bei der objektorientierten Programmierung zum Einsatz. Ein Objekttyp (Klasse) ist die programmtechnische Repräsentation eines Entitätstyps, erweitert um zugehörige Bearbeitungsfunktionen (Methoden).

## Andere Programmiersprachen
### Objekte in C
#### Definition

In der Programmiersprache C gibt es eine pragmatische Definition, was dort als Objekt gilt:
   object region of data storage in the execution environment, the contents of which can represent values Note: When referenced, an object may be interpreted as having a particular type; see 6.3.2.1
C gilt allerdings nicht als objektorientierte Programmiersprache. Die Konzepte der objektorientierten Softwareentwicklung, wie Vererbung, Polymorphie und Datenkapselung fehlen im Sprachkern und müssen über selbstdefinierte Funktionen nachgebaut werden. Hierfür existieren verschiedene Programmbibliotheken. Sofern ausschließlich über diese Funktionen auf einen reservierten Speicherbereich zugegriffen wird, erfüllt er die Kriterien eines „Objektes“ aus objektorientierter Sicht.

#### Realisierung

Der Zustand eines Objektes im Sinne der genannten Definition ist durch die Werte seiner Attribute vollständig bestimmt. Unbenannte Attribute sowie Füllbits und -bytes (Padding) tragen dabei nichts zum definierten Zustand des Objektes bei, ihr Inhalt ist undefiniert.
C kennt keine Methoden. Diese müssen über Funktionen, die einen Zeiger auf den reservierten Speicherbereich als ersten Parameter bekommen, nachgebildet werden. Polymorphie wird über Funktionszeiger, die als Attribute im Objekt gespeichert werden, realisiert.
Die eindeutige Identität eines Objektes wird durch seine Speicheradresse definiert. Somit muss jedes Objekt eine eigene Speicheradresse haben. Dies wird sichergestellt, indem jede Datenstruktur mindestens 1 Byte Speicher belegt. Wird die Speicheradresse eines Objektes im Programm jedoch nicht benötigt und kann der Compiler dies erkennen, ist es möglich, dass für dieses Objekt kein Speicher reserviert wird, da die Semantik des Programmes sich hierdurch nicht ändert.

## Semantic Web

Das Semantic Web ist im Wesentlichen ein Framework für verteilte Objekte. Zwei Schlüsseltechnologien im Semantic Web sind die Web Ontology Language (OWL) und das Resource Description Framework (RDF). RDF bietet die Möglichkeit, grundlegende Objekte zu definieren – Namen, Eigenschaften, Attribute, Beziehungen –, auf die über das Internet zugegriffen werden kann. OWL fügt ein umfangreicheres Objektmodell hinzu, das auf der Mengenlehre basiert und zusätzliche Modellierungsfunktionen wie Mehrfachvererbung bietet.
OWL-Objekte sind nicht wie standardmäßige verteilte Objekte, auf die über eine Schnittstellenbeschreibungssprache zugegriffen wird. Ein solcher Ansatz wäre für das Internet nicht geeignet, da sich das Internet ständig weiterentwickelt und eine Standardisierung auf einer Reihe von Schnittstellen schwierig zu erreichen ist. OWL-Objekte ähneln in der Regel der Art von Objekten, die zum Definieren von Anwendungsdomänen in objektorientierten Programmiersprachen verwendet werden.
Es gibt jedoch wichtige Unterschiede zwischen OWL-Objekten und herkömmlichen objektorientierten Programmierobjekten. Herkömmliche Objekte werden normalerweise mit einfacher Vererbung in statische Hierarchien kompiliert, OWL-Objekte sind jedoch dynamisch. Ein OWL-Objekt kann zur Laufzeit seine Struktur ändern und eine Instanz neuer oder anderer Klassen werden.
Ein weiterer kritischer Unterschied ist die Art und Weise, wie das Modell Informationen behandelt, die sich derzeit nicht im System befinden. Programmierobjekte und die meisten Datenbanksysteme verwenden die Closed world assumption. Wenn dem System eine Tatsache nicht bekannt ist, wird angenommen, dass diese Tatsache falsch ist. Semantic Web-Objekte verwenden die Open world assumption. Eine Aussage wird nur dann als falsch angesehen, wenn tatsächlich relevante Informationen vorliegen, dass sie falsch ist. Andernfalls wird angenommen, dass sie unbekannt ist, weder wahr noch falsch.
OWL-Objekte ähneln tatsächlich Objekten in Rahmensprachen mit künstlicher Intelligenz wie KL-ONE und Loom.
In der folgenden Tabelle werden herkömmliche Objekte aus objektorientierten Programmiersprachen wie C#, C++ und Java mit Semantic Web Objects verglichen:
| Objektorientierte Programmiersprachen | OWL und RDF |
| Klassen und Instanzen ||
| Klassen werden als Typen für Instanzen angesehen. | Klassen werden als Gruppen von Individuen betrachtet. |
| Jede Instanz hat eine Klasse als Typ. Klassen können keine Instanzen gemeinsam nutzen. | Jedes Individuum kann mehreren Klassen angehören. |
| Instanzen können ihren Typ zur Laufzeit nicht ändern. | Die Klassenmitgliedschaft kann sich zur Laufzeit ändern. |
| Die Liste der Klassen ist zur Übersetzungszeit vollständig bekannt und kann sich danach nicht mehr ändern. | Klassen können zur Laufzeit erstellt und geändert werden. |
| Compiler werden zur Erstellungszeit verwendet. Fehler bei der Kompilierung weisen auf Probleme hin. | Reasoner können zur Klassifizierung und Konsistenzprüfung zur Laufzeit oder zur Erstellungszeit verwendet werden. |
| Eigenschaften, Attribute und Werte ||
| Eigenschaften werden lokal für eine Klasse und ihre Unterklassen durch Vererbung definiert. | Eigenschaften sind eigenständige Entitäten, die ohne bestimmte Klassen existieren können. |
| Instanzen können nur Werte für die angehängten Eigenschaften haben. Die Werte müssen korrekt eingegeben werden. Bereichsbeschränkungen werden zur Typprüfung verwendet. | Instanzen können für jede Eigenschaft beliebige Werte haben. Bereichs- und Domäneneinschränkungen können zur Typprüfung und Typinferenz verwendet werden. |
| Klassen implementieren einen Großteil ihrer Bedeutung und ihres Verhaltens durch imperative Funktionen und Methoden. | Klassen machen ihre Bedeutung in Form von OWL-Anweisungen explizit. Es kann kein zwingender Code angehängt werden. |
| Klassen können ihre Member für den privaten Zugriff kapseln. | Alle Teile einer OWL-Datei oder RDF-Datei sind öffentlich und können von jedem anderen Ort aus verlinkt werden. |
| Closed world assumption: Wenn es nicht genügend Informationen gibt, um eine Aussage als wahr zu beweisen, wird angenommen, dass sie falsch ist. | Open world assumption: Wenn es nicht genügend Informationen gibt, um eine Aussage als wahr zu beweisen, kann sie wahr oder falsch sein. |
| Rolle im Designprozess ||
| Einige generische APIs werden von Anwendungen gemeinsam genutzt. Es werden nur wenige UML-Diagramme gemeinsam genutzt. | RDF und OWL wurden von Grund auf für das Web entwickelt. Domain-Modelle können online geteilt werden. |
| Domänenmodelle werden als Teil einer Softwarearchitektur entworfen. | Domänenmodelle dienen zur Darstellung des Wissens über eine Domäne und zur Informationsintegration. |
| UML, Java, C# usw. sind ausgereifte Technologien, die von vielen kommerziellen und Open-Source-Tools unterstützt werden. | Das Semantic Web ist eine aufstrebende Technologie mit einigen Open-Source-Tools und einer Handvoll kommerzieller Anbieter. |
| Verschiedene Funktionen ||
| Instanzen sind insofern anonym, als sie von außerhalb eines ausführenden Programms nicht einfach angesprochen werden können. | Alle genannten RDF- und OWL-Ressourcen verfügen über einen eindeutigen URI, unter dem auf sie verwiesen werden kann. |
| UML-Modelle können in XML serialisiert werden, das für den Austausch von Tools ausgelegt ist, jedoch nicht wirklich webbasiert. Java-Objekte können in verschiedenen XML-basierten oder nativen Zwischenformaten serialisiert werden. | RDF- und OWL-Objekte verfügen über eine auf XML basierende Standardserialisierung mit eindeutigen URIs für jede Ressource in der Datei. |