Objekt-Orientierte Programmierung

Werbung
Technische Universität München
Objekt-Orientierte Programmierung
•
•
•
•
Ein OO-Programm modelliert eine Anwendung als eine Welt von
Objekten, die miteinander in Beziehung stehen (↑später).
Ein Objekt kann andere Objekte erzeugen.
Ein Objekt kann eigene Methoden und die Methoden anderer
Objekte aufrufen.
Ein Objekt hat Datenfelder, die Werte beinhalten und während des
Programmablaufs geändert werden können.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Objekte
•
•
•
•
Können zur Modellierung von realen Objekten verwendet werden.
Können Software-Einheiten repräsentieren, z.B. Ereignisse,
Dateien, Bilder, etc.
Können abstrakte Konzepte repräsentieren, z.B. Regeln eines
Spieles, einen speziellen Tanztyp, etc.
Können zur Repräsentation von GUI (Graphical User Interface)
Komponenten verwendet werden.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Klassen und Objekte
•
•
•
Eine Klasse ist ein Stück eines Quellcodes, das einen speziellen
Objekttyp (Sorte) beschreibt.
→ OO-Programmierer schreiben Klassendefinitionen
Ein Objekt wird eine Instanz einer Klasse genannt.
Ein Programm kann beliebig viele Instanzen einer Klasse anlegen
und verwenden.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Klassen und Objekte
Klasse
•
Eine Blaupause (Plan) für
Objekte eines speziellen Typs
•
Definiert die Struktur (Anzahl,
Typen) der Attribute
Objekt
Attribute
Verhalten
•
Definiert das Verhalten
(Funktionalität) der Objekte
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Klassen und Objekte
Klasse: Auto
Objekt: ein spezielles Auto
Attribute:
String
Farbe
int
int
double
typ
farbe
leistung
anzPersonen
verbrauch
Verhalten:
Insassen hinzufügen/entfernen,
volltanken,
melde leeren Tank
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Attribute:
typ = "Mustang―
farbe = ―gelb‖
leistung = 220
anzPersonen = 0
verbrauch = 12.5
Verhalten:
Technische Universität München
Klassen und Objekte
Klasse
Objekt
Ein Stück Quelltext
Eine Instanz in einem laufenden
Programm
Geschrieben von einem
Programmierer
Wird zur Laufzeit des Programms
angelegt (von der main-Methode oder
einer anderen Methode)
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
6
Technische Universität München
Klassen und Objekte
Klasse
Objekt
Spezifiziert die Struktur (die Anzahl
und Typen) seiner Objektattribute —
gleich für alle Objekte dieser Sorte
Speichert spezielle Attributwerte;
diese können sich während des
Programmlaufs ändern
Spezifiziert das Verhalten seiner
Objekte
Verhält sich entsprechend
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
7
Technische Universität München
Klassen und Quelldateien
•
•
Jede Klasse ist in einer seperaten Datei gespeichert
Der Name der Datei muss gleich dem Namen der Klasse sein, mit
der Erweiterung .java
Car.java
public class Car
{
...
}
Konvention: der Name
der Klasse (und der
entspr. Datei)
beginnen mit einem
Großbuchstaben.
(In Java sind alle Namen ―case-sensitive‖.)
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Bibliotheken
•
•
•
•
Java Programme werden normalerweise nicht ―von Null‖
geschrieben.
Es existieren bereits hunderte von Klassenbibliotheken, in denen
Klassen für unterschiedlichste Anwendungen definiert wurden.
Klassenbibliotheken sind in ―Packages‖ organisiert.
Beispiel:
java.util — miscellaneous utility classes
java.awt — windowing and graphics toolkit
javax.swing — GUI development package
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Klassen-Import
•
•
Um Klassen innerhalb von Paketen nutzen zu können, müssen sie
dem Compiler präzise beschrieben werden
Vollständige qualifizierte Klassennamen beinhalten den PackageNamen:
java.awt.Color
javax.swing.JButton
•
import-Statements zu Beginn des Quellcodes erlauben es,
Abkürzungen zu verwenden:
import javax.swing.JButton;
...
JButton go = new JButton("Go");
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
vollständig
qualifiziert
Technische Universität München
Klassen-Import
•
Man kann alle Klassennamen aus einem Package importieren
lassen, in dem man eine ―wildcard‖ .* verwendet:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
•
Importiert alle
Klassen aus awt,
awt.event, und swing
Packages
java.lang wird automatisch in alle Klassen importiert; definiert
System, Math, Object, String, und andere häufig verwendete
Klassen.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
SomeClass.java
Klassendefinition
import …
import statements
public class SomeClass {
Members
Attribute
Konstruktoren
Funktionskopf
Variablen, die den Objektzustand definieren;
Basistypen, Strings, andere Objekte
Prozeduren für die Initialisierung der
Attribute beim Anlegen eines neuen
Objekts der Klasse
Methoden
}
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Aktionen (Funktioen oder
Prozeduren), die ein Objekt
dieser Klasse ausführen kann
Technische Universität München
Attribute
•
Instanz-Variablen – der ―private Speicher‖ der Objekte
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Attributname
Attribute
[private|public] [static] [final] datatype name;
optional:
normalerweise
private
optional: bedeutet,
dass das Attribute nur
einmal für die Klasse
angelegt wird;
Klassenattribute
int, double, etc., oder
ein Objekt
optional: bedeutet,
dass das Attribute
eine Konstante ist und
nicht mehr geändert
werden kann
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Konstruktoren
•
Prozeduren, um ein Objekt bei der Konstruktion zu initialisieren
– Haben immer den Namen der Klasse
– Initialisieren die Objektattribute
– Können Parameter haben
•
Eine Klasse kann mehrere Konstruktoren besitzen, die sich in der
Anzahl und im Typ der Parameter unterscheiden
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Konstruktoren
•
•
•
Ein privater Konstruktor ist ein spezieller Instanz-konstruktor.
Er wird häufig für Klassen verwendet, die nur statische Member
enthalten.
Wenn eine Klasse über einen oder mehrere private und keine
öffentlichen Konstruktoren verfügt, dürfen von anderen Klassen
keine Instanzen dieser Klasse erstellt werden.
– Beispielsweise weil die Klasse nur als ein Behälter
statischer Methoden dienen soll.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Konstruktoren
...
Car myCar;
...
myCar = new Car (“Opel”, 6.4, 150, 25000);
...
public class Car {
Ein Objekt wird durch den new
Operator kreiert
Die Anzahl, Reihenfolge und
Typen der Parameter müssen mit
der Deklaration übereinstimmen
...
public Car (String typ, float x, int y, int z) {
...
}
...
}
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Konstruktor
Technische Universität München
Konstruktoren – ein Beispiel
JButton go = new JButton("Go");
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Konstruktoren
class Car {
private
private
private
private
String typ;
float verbrauch;
int
ausstoß;
int
preis;
Car ( String typ, float verbrauch, int co2, int preis ) {
this.typ = typ;
this.verbrauch = verbrauch;
ausstoß = co2;
this.preis = preis;
}
}
Im Rumpf einer Methode kann auf das Objekt, für das die
Methode aufgerufen wird, durch das Schlüsselwort this
verwiesen werden
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Konstruktoren
class MyStaticClass {
public static int i;
public static short s;
static {
i = 10;
s = 20;
}
}
Ein statischer (parameterloser) Konstruktor kann verwendet
werden, um statische Variablen mit einem Wert zu
initialisieren. Der Konstruktor kann dabei ausschließlich
statische Variablen mit einem Startwert vorbelegen.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Methoden
•
•
•
Methoden werden für ein spezielles Objekt aufgerufen
Die Anzahl und Typen der Parameter (Argumente) eines
Funktionsaufrufs müssen mit der Deklaration übereinstimmen
Eine Methode liefert entweder einen Wert zurück oder wird durch
das Schlüsselwort void im Funktionskopf als Prozedur deklariert
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Methoden
class MyClass {
public int a;
public MyClass ( int x ) { a = x; }
public void MyMethod() {
System.out.print("my method was called");
}
}
public class MyTest {
public static void main(String[] args) {
MyClass object = new MyClass(1);
object.a = 3;
System.out.print(object.a);
object.MyMethod();
}
}
Der Objektname
wird durch den
Punktoperator vom gewünschten Element
(Attribut/Methode) getrennt notiert.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Kapselung
•
•
•
Die besondere Idee der Klassen und ihrer Objekte ist die
Kapselung von Daten (Programmvariablen) und Algorithmen
(Methoden) in eine Einheit.
Die Objektorientierung bietet syntaktische Mittel, um sicherzustellen, dass Programmteile nur auf die ihnen zugeordneten
Programmvariablen zugreifen.
Regelung
– Die Namen privater Attribute sind nur innerhalb des Klassenrumpfes gültig, ihre
Lebensdauer ist mit der Lebensdauer des Objekts gleichgesetzt.
– Private Attribute können ausschließlich durch Zuweisungen im Rumpf von
Methoden des Objekts verändert werden, in dem auch das Attribut angesiedelt
ist und auch nur dort gelesen werden.
– Die Lebensdauer der Attribute, der lokalen Daten, eines Objekts und damit
seiner Methoden besteht über die Dauer des Aufrufs einer Methode fort.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Methoden
•
•
Konstruktoren und Methoden können andere public und private
Methoden der selben Klasse aufrufen.
Konstruktoren und Methoden können nur public Methoden anderer
Klassen aufrufen
Class X
Class Y
private field
public Methode
private method
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
public Methode
Technische Universität München
Kapselung
class Konto
private
private
private
{
String
String
int
kontonummer;
kontoinhaber;
kontostand;
Konto(String ktoNr, String ktoInh, int startWert) {
. . .
}
public void erbUebertrag(Konto kto) {
kontostand = kontostand + kto.kontostand;
kto.kontostand
=
0;
}
}
Korrekt, da innerhalb von Methoden eines Objektes einer
Sorte alle lokalen Atttribute und Methoden der Sorte
sichtbar sind!
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Kapselung
class Konto {
private
private
public
String
String
int
kontonummer;
kontoinhaber;
kontostand;
Konto(String ktoNr, String ktoInh, int startWert) {
. . .
}
}
public class KontoTester {
public static void main(String[] args) {
Konto meinKonto = new Konto(“123”, “Westermann”, 100);
meinKonto.kontostand = 1000;
write( meinKonto.kontonummer + “:” + meinKonto.kontostand );
}
}
Fehler bei Übersetzung, da kontonummer in main
nicht
sichtbar ist!
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Kapselung
Die Referenz null bezeichnet ein vorgegebenes
Referenzelement, dessen Bezugselement
undefiniert ist.
class Car {
public
static
int
lagerbestand = 0;
private static
Car[]
lagerListe = new Car[1000];
…
Car(String type, float verbrauch, int co2, int preis) {. . .}
Car(Car newCar) {. . .}
public static void einkauf(Car newCar) {
lagerListe[lagerbestand] = new Car(newCar);
lagerbestand++;
}
public static void verkauf(int index) {
lagerListe[index] = null;
// nicht empfehlenswert!!!
lagerbestand--;
}
}
Im Rumpf einer (Klassen)methode kann auf
Klassenattribute zugegriffen werden.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Kapselung
class Car {
public
static
int
lagerbestand = 0;
private static
float
gewinn = 0;
private static
Car[]
lagerListe = new Car[1000];
…
public static void einkauf(Car newCar) {. . .}
public static void verkauf(int index) {. . .}
}
public class Organizer {
public static void main(String[] args) {
Car car = new Car(. . .);
write(“Aktueller Bestand:” + Car.lagerbestand);
write(“Aktueller Gewinn:” + Car.gewinn);
Car.einkauf(car);
}
}
Fehler beim Kompilieren, da Klassenattribut
gewinn in main nicht sichtbar ist!
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Sichtbarkeiten
•
Erlaubte Zugriffe auf Attribute und Methoden:
public
default
private
Klasse selbst
X
X
X
Andere Klasse im gleichen Paket
X
X
Andere Klasse im anderen Paket
X
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Sichtbarkeit in Packages in Java
•
Für Klassen, die auf der obersten Ebene direkt in einem Paket
deklariert sind, gelten folgende Regeln (sie gelten nicht für Klassen,
die als Member einer anderen Klasse definiert wurden → später):
– Wenn eine Klasse nicht mit dem Klassenmodifikator "public" deklariert wird,
dann ist sie nur innerhalb ihres Pakets sichtbar.
– Wenn eine Klasse mit dem Klassenmodifizierer "public" deklariert wird, dann ist
sie in allen Paketen der Hierarchie sichtbar.
– In Java darf nicht mehr als eine öffentliche Klasse in einer Übersetzungseinheit
enthalten sein, eine Übersetzungseinheit darf aber mehrere (nicht-öffentliche)
Klassen enthalten.
– Für Klassendeklarationen der obersten Ebene ist der Klassenmodifizierer
"private" nicht anwendbar.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Technische Universität München
Sichtbarkeit in Packages in Java
•
•
•
•
Ein Zugriff auf eine Methode einer Klasse ist nur möglich, wenn ein
Zugriff auf die Klasse möglich ist. Ist der Zugriff auf eine Klasse
möglich, so ist aber der Zugriff auf alle Methoden der Klasse nicht
unbedingt möglich.
Wenn bei der Deklaration einer Methode keine
Methodenmodifikatoren für den Zugriff angegeben wird, dann ist
die Methode nur in dem Paket der Methode sichtbar.
Wird eine Methode mit dem Methodenmodifizierer "public"
deklariert, dann ist diese Methode in allen Paketen der Hierarchie
sichtbar.
Wird eine Methode mit dem Methodenmodifikator "private"
deklariert, so ist diese Methode nur innerhalb der
Klassendeklaration der Klasse sichtbar, in der die Methode
deklariert wird.
Fakultät für Informatik, Einführung in die Informatik, WS 2010/11
Herunterladen