OOP: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „Natürlich! Hier ist eine übersichtliche Einführung in die **Objektorientierte Programmierung (OOP) in Java** im **MediaWiki-Stil**, wie du es bereits von DDL, DML und DQL kennst – ideal zur Dokumentation oder für Unterrichtszwecke: --- \== Objektorientierte Programmierung (OOP) in Java == Die objektorientierte Programmierung ist ein Paradigma, das Programme auf Basis von **Objekten** strukturiert. Java ist eine vollständig objektorientierte Spra…“ |
Keine Bearbeitungszusammenfassung |
||
(40 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Objektorientierte Programmierung (OOP) in Java == | |||
Die objektorientierte Programmierung ist ein Paradigma, das Programme auf Basis von '''Objekten''' strukturiert. Java ist eine vollständig objektorientierte Sprache (mit Ausnahme der primitiven Datentypen). | |||
Ein objektorientiertes Programm ist ein System von Objekten, die miteinander kommunizieren können. Wir haben schon mit Objekten gearbeitet, z. B. Scanner oder ArrayList. | |||
Jetzt geht es darum, ''' eigene Klassen ''' zu definieren. | |||
=== Klassen und Objekte === | |||
* Man kann sich eine Klasse als Fabrik vorstellen, die Objekte produziert | |||
* | |||
* Hier wird festgelegt, welche Eigenschaften und welches Verhalten ein Objekt hat | |||
* | |||
* Eine Klasse kann beliebig viele Objekte erzeugen | |||
* | |||
* Ein Objekt gehört jedoch immer zu genau einer Klasse | |||
Wenn man sich die Klasse als Fabrik vorstellt, so ist das daraus erzeugte Objekt etwas ganz Konkretes. Man nennt Objekte auch | |||
Instanzen.<br> | |||
Nehmen wir beispielsweise die Klasse Auto. <br> | |||
Konkrete Auto-Objekte sind: ein bestimmter Mercedes, ein bestimmter BMW. | |||
* Alle diese Objekte haben gewisse gemeinsame Merkmale, z. B. eine Marke, ein Baujahr etc. | |||
* | |||
* Diese Merkmale nennt man Attribute (Eigenschaften) eines Objekts. | |||
* | |||
* Ein Attribut besteht aus einem Namen und einem Wert. | |||
* | |||
* Objekte können außerdem Operationen ausführen. Man nennt diese Operationen Methoden. | |||
* | |||
* Methoden sind nichts anderes als Funktionen, die innerhalb einer Klasse definiert sind. | |||
* | |||
Eine Klasse ist eine Vorlage (Bauplan) für Objekte. Ein Objekt ist eine Instanz dieser Klasse. | Eine Klasse ist eine Vorlage (Bauplan) für Objekte. Ein Objekt ist eine Instanz dieser Klasse. | ||
Zeile 18: | Zeile 38: | ||
int baujahr; | int baujahr; | ||
public void starten() { | public void starten() { | ||
System.out.println("Motor startet"); | |||
} | } | ||
} </syntaxhighlight> | } </syntaxhighlight> | ||
Zeile 35: | Zeile 54: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Attribute und Methoden === | |||
* '''Attribute''' (Eigenschaften, Instanzvariablen): Eigenschaften eines Objekts | |||
* '''Methoden''': Verhalten eines Objekts | |||
=== Konstruktoren === | |||
Ein Konstruktor initialisiert ein Objekt beim Erzeugen. | |||
Wird ein neues Objekt mit '''new''' erzeugt und kein eigener Konstruktor programmiert, stellt Java Speicherplatz für die Instanzvariablen bereit und initialisiert diese mit 0, false oder null (je nach Datentyp).<br> | |||
* Die Initialisierung der Instanzvariablen übernimmt eine spezielle Methode, nämlich der Konstruktor. | |||
* | |||
* Programmieren Sie keinen eigenen Konstruktor erzeugt der Java-Compiler einen Defaultkonstruktor. | |||
* | |||
* Oft ist es aber besser einen eigenen Konstruktor zu programmieren, um die Initialisierung in der "eigenen Hand" zu haben. | |||
* | |||
* Der Name des Konstruktors muss mit dem Namen der Klasse übereinstimmen | |||
* | |||
* Der Konstruktor liefert nie ein Ergebnis zurück. Er darf '''nicht''' mit '''void''' gekennzeichnet werden | |||
* | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Zeile 52: | Zeile 80: | ||
String marke; | String marke; | ||
public Auto(String marke) { | |||
public Auto(String marke) { | this.marke = marke; | ||
} | |||
} | |||
} </syntaxhighlight> | } </syntaxhighlight> | ||
Zeile 66: | Zeile 92: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== this-Referenz === | |||
'''this''' verweist auf das aktuelle Objekt und stellt die Unterscheidung zwischen der Instanzvariable und des Methodenparameters sicher: | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Zeile 76: | Zeile 100: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Sichtbarkeiten (Access Modifiers) in Java === | |||
{| class="wikitable" | |||
! Modifizierer | |||
! Zugriff innerhalb der Klasse | |||
! Zugriff im selben Paket | |||
! Zugriff in Unterklassen | |||
! Zugriff außerhalb (global) | |||
Attribute werden privat gemacht und über Getter/Setter kontrolliert. | |- | ||
| '''private''' | |||
| Ja | |||
| Nein | |||
| Nein | |||
| Nein | |||
|- | |||
| '''(default)'''<br />(kein Modifizierer) | |||
| Ja | |||
| Ja | |||
| Nein | |||
| Nein | |||
|- | |||
| '''protected''' | |||
| Ja | |||
| Ja | |||
| Ja | |||
| Nein | |||
|- | |||
| '''public''' | |||
| Ja | |||
| Ja | |||
| Ja | |||
| Ja | |||
|} | |||
''' Hinweise ''' | |||
* Der '''default'''-Zugriff gilt, wenn ''kein'' Modifizierer angegeben ist. | |||
* '''protected''' erlaubt zusätzlich Zugriff in ''Unterklassen'', auch wenn diese in ''anderen Paketen'' liegen. | |||
* Die Kombination von '''private''' Attributen mit '''public''' Getter/Setter ist Teil der '''Kapselung'''. | |||
=== Kapselung (Encapsulation) === | |||
Die Kapselung ist eines der zentralen Prinzipien der objektorientierten Programmierung. Dabei werden Daten (Attribute) innerhalb einer Klasse versteckt und der Zugriff nur über Methoden (Getter/Setter) erlaubt. | |||
''' Ziel der Kapselung ''' | |||
* Schutz der Daten vor unkontrolliertem Zugriff von außen | |||
* | |||
* Verbesserung der Wartbarkeit und Erweiterbarkeit des Codes | |||
* | |||
* Klare Trennung zwischen internem Zustand und externer Schnittstelle | |||
* | |||
* Attribute werden privat gemacht und über Getter/Setter kontrolliert. | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Zeile 86: | Zeile 162: | ||
private String name; | private String name; | ||
public String getName() { | |||
public String getName() { | return name; | ||
} | |||
} | |||
public void setName(String n) { | public void setName(String n) { | ||
name = n; | |||
} | } | ||
} </syntaxhighlight> | } </syntaxhighlight> | ||
=== Vererbung (Inheritance) === | |||
Eine Klasse kann von einer anderen erben: | Eine Klasse kann von einer anderen erben: | ||
Zeile 110: | Zeile 182: | ||
public class Auto extends Fahrzeug { | public class Auto extends Fahrzeug { | ||
int tueranzahl; | int tueranzahl; | ||
} </syntaxhighlight> | } </syntaxhighlight> | ||
=== Polymorphie === | |||
[[Polymorphie]] bedeutet, dass ein Objekt mehrere Formen annehmen kann – z. B. durch Überschreiben (Overriding) von Methoden: | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
Zeile 127: | Zeile 197: | ||
class Hund extends Tier { | class Hund extends Tier { | ||
public void geraeusch() { | public void geraeusch() { | ||
System.out.println("Wuff!"); | System.out.println("Wuff!"); | ||
} | } | ||
} </syntaxhighlight> | } </syntaxhighlight> | ||
=== Abstrakte Klassen === | |||
Dienen als Basisklassen mit nicht vollständiger Implementierung: | Dienen als Basisklassen mit nicht vollständiger Implementierung: | ||
Zeile 144: | Zeile 212: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Interfaces === | |||
Definieren nur die Methode, aber keine Implementierung: | Definieren nur die Methode, aber keine Implementierung: | ||
Zeile 156: | Zeile 222: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | === Wichtige OOP-Prinzipien === | ||
* | |||
* | * '''Kapselung''' – Daten verbergen | ||
* | * '''Vererbung''' – Wiederverwendbarkeit | ||
* '''Polymorphie''' – Einheitliches Ansprechen unterschiedlicher Objekte | |||
* '''Abstraktion''' – Komplexität reduzieren | |||
[[Kategorie:Programmieren]] | |||
[[Kategorie:Semester2]] |
Aktuelle Version vom 2. Juni 2025, 11:21 Uhr
Objektorientierte Programmierung (OOP) in Java
Die objektorientierte Programmierung ist ein Paradigma, das Programme auf Basis von Objekten strukturiert. Java ist eine vollständig objektorientierte Sprache (mit Ausnahme der primitiven Datentypen). Ein objektorientiertes Programm ist ein System von Objekten, die miteinander kommunizieren können. Wir haben schon mit Objekten gearbeitet, z. B. Scanner oder ArrayList.
Jetzt geht es darum, eigene Klassen zu definieren.
Klassen und Objekte
- Man kann sich eine Klasse als Fabrik vorstellen, die Objekte produziert
- Hier wird festgelegt, welche Eigenschaften und welches Verhalten ein Objekt hat
- Eine Klasse kann beliebig viele Objekte erzeugen
- Ein Objekt gehört jedoch immer zu genau einer Klasse
Wenn man sich die Klasse als Fabrik vorstellt, so ist das daraus erzeugte Objekt etwas ganz Konkretes. Man nennt Objekte auch
Instanzen.
Nehmen wir beispielsweise die Klasse Auto.
Konkrete Auto-Objekte sind: ein bestimmter Mercedes, ein bestimmter BMW.
- Alle diese Objekte haben gewisse gemeinsame Merkmale, z. B. eine Marke, ein Baujahr etc.
- Diese Merkmale nennt man Attribute (Eigenschaften) eines Objekts.
- Ein Attribut besteht aus einem Namen und einem Wert.
- Objekte können außerdem Operationen ausführen. Man nennt diese Operationen Methoden.
- Methoden sind nichts anderes als Funktionen, die innerhalb einer Klasse definiert sind.
Eine Klasse ist eine Vorlage (Bauplan) für Objekte. Ein Objekt ist eine Instanz dieser Klasse.
public class Auto {
String marke;
int baujahr;
public void starten() {
System.out.println("Motor startet");
}
}
Objekterzeugung:
Auto meinAuto = new Auto();
meinAuto.marke = "VW";
meinAuto.baujahr = 2022;
meinAuto.starten();
Attribute und Methoden
- Attribute (Eigenschaften, Instanzvariablen): Eigenschaften eines Objekts
- Methoden: Verhalten eines Objekts
Konstruktoren
Ein Konstruktor initialisiert ein Objekt beim Erzeugen.
Wird ein neues Objekt mit new erzeugt und kein eigener Konstruktor programmiert, stellt Java Speicherplatz für die Instanzvariablen bereit und initialisiert diese mit 0, false oder null (je nach Datentyp).
- Die Initialisierung der Instanzvariablen übernimmt eine spezielle Methode, nämlich der Konstruktor.
- Programmieren Sie keinen eigenen Konstruktor erzeugt der Java-Compiler einen Defaultkonstruktor.
- Oft ist es aber besser einen eigenen Konstruktor zu programmieren, um die Initialisierung in der "eigenen Hand" zu haben.
- Der Name des Konstruktors muss mit dem Namen der Klasse übereinstimmen
- Der Konstruktor liefert nie ein Ergebnis zurück. Er darf nicht mit void gekennzeichnet werden
public class Auto {
String marke;
public Auto(String marke) {
this.marke = marke;
}
}
Aufruf:
Auto a = new Auto("BMW");
this-Referenz
this verweist auf das aktuelle Objekt und stellt die Unterscheidung zwischen der Instanzvariable und des Methodenparameters sicher:
this.marke = marke;
Sichtbarkeiten (Access Modifiers) in Java
Modifizierer | Zugriff innerhalb der Klasse | Zugriff im selben Paket | Zugriff in Unterklassen | Zugriff außerhalb (global) |
---|---|---|---|---|
private | Ja | Nein | Nein | Nein |
(default) (kein Modifizierer) |
Ja | Ja | Nein | Nein |
protected | Ja | Ja | Ja | Nein |
public | Ja | Ja | Ja | Ja |
Hinweise
- Der default-Zugriff gilt, wenn kein Modifizierer angegeben ist.
- protected erlaubt zusätzlich Zugriff in Unterklassen, auch wenn diese in anderen Paketen liegen.
- Die Kombination von private Attributen mit public Getter/Setter ist Teil der Kapselung.
Kapselung (Encapsulation)
Die Kapselung ist eines der zentralen Prinzipien der objektorientierten Programmierung. Dabei werden Daten (Attribute) innerhalb einer Klasse versteckt und der Zugriff nur über Methoden (Getter/Setter) erlaubt.
Ziel der Kapselung
- Schutz der Daten vor unkontrolliertem Zugriff von außen
- Verbesserung der Wartbarkeit und Erweiterbarkeit des Codes
- Klare Trennung zwischen internem Zustand und externer Schnittstelle
- Attribute werden privat gemacht und über Getter/Setter kontrolliert.
public class Kunde {
private String name;
public String getName() {
return name;
}
public void setName(String n) {
name = n;
}
}
Vererbung (Inheritance)
Eine Klasse kann von einer anderen erben:
public class Fahrzeug {
int geschwindigkeit;
}
public class Auto extends Fahrzeug {
int tueranzahl;
}
Polymorphie
Polymorphie bedeutet, dass ein Objekt mehrere Formen annehmen kann – z. B. durch Überschreiben (Overriding) von Methoden:
class Tier {
public void geraeusch() {
System.out.println("Ein Tier macht ein Geräusch");
}
}
class Hund extends Tier {
public void geraeusch() {
System.out.println("Wuff!");
}
}
Abstrakte Klassen
Dienen als Basisklassen mit nicht vollständiger Implementierung:
abstract class Figur {
abstract double berechneFlaeche();
}
Interfaces
Definieren nur die Methode, aber keine Implementierung:
interface Bewegbar {
void bewege();
}
Wichtige OOP-Prinzipien
- Kapselung – Daten verbergen
- Vererbung – Wiederverwendbarkeit
- Polymorphie – Einheitliches Ansprechen unterschiedlicher Objekte
- Abstraktion – Komplexität reduzieren