Unterschiede C++ / Java

Werbung
Java
FH Merseburg SS 2002
1.
Objektorientierung
1.1
Allgemeine Sicht auf Objekte
Objektorientierung ist eine Problemlösungsstrategie, die im Wesentlichen auf den
Konzepten



Datenkapselung
Vererbung und
Polymorphie
beruht. Sie wird zur Modellierung von Systemen eingesetzt, die dabei durch eine
Menge von Objekten dargestellt werden. Diese Objekte interagieren miteinander.
Kunde
6. 500 DM
aushändigen
Kassen
automat
-
4. 500 DM
ausgeben
1. 500 DM
abheben
2. 500 DM abbuchen
Konto
5. 500 DM
bereitstellen
3. Quittung
Bankangestellter
Die Vorteile dieser Strategie sind:
 das Verständnis für die Systeme wird einfacher
 Modifikationen und Erweiterungen sind einfach und häufig nur auf einige wenige
Objekte beschränkt
Ein Objekt ist eine Einheit aus Information und Dienstleistung. Es wird
beschrieben durch Attribute (Zustand, Daten) und Operationen (Verhalten,
Methoden). Die Attribute speichern die Auswirkungen der Operationen.
Objekte entsprechen häufig Dingen aus der Realität.
582657400
-1-
Java
FH Merseburg SS 2002
Objekt Konto
einzahlen()
abrechnen()
•Kontonummer
•Saldo
•Kunde
überweisen()
Das Objekt besitzt eine Identität, ein Verhalten, einen Zustand und Schnittstellen.
Daten, und zugehörige Methoden werden gemeinsam entworfen, implementiert und
gewartet.
Objekt Bankangestellter
abhebenGeld()
beratenKunde()
•Gehalt: 6.000
•Name: Schmidt
•Alter: 38
•Termine ....
vereinbarenTermine()
Ein Objekt schützt seine Daten vor unerlaubtem Zugriff. Für die Außenwelt sind nur
die Operationen sichtbar, und zwar nur ihre Aktivitäten, nicht aber die Art und
Weise, wie sie agieren.
1.2
Klassen
In objektorientierten Systemen sich Objekte identifizieren, die gleiche Attribute
aufweisen und gleiches Verhalten, die sich nur in den konkreten Ausprägungen
unterscheiden.
582657400
-2-
Java
FH Merseburg SS 2002
Objekte heißen gleichartig, wenn sie gleichen Aufbau und gleiches Verhalten haben.
Gleichartige Objekte werden in einer zentralen Stelle, in Klassen beschrieben.
Objekt 1
Objekt 2
Klasse
Objekt 3
Eine Klasse ist eine Schablone (Bauplan), mit deren Hilfe Objekte mit gleichen
Aspekten erzeugt werden können. Klassen verkörpern alle Funktionen einer
bestimmten Objektmenge.
Wenn man ein Programm in einer objektorientierten Sprache schreibt, definiert man
Klassen. Beispielsweise kann man eine Klasse Tree definieren, die die Eigenschaften
aller Bäume beschreibt (hat Äste und Wurzeln, wächst und gibt Sauerstoff ab). Die
Klasse Tree dient als abstraktes Modell des Konzepts eines Baums. Sie stellt jedoch
keinen bestimmten Baum dar, sondern einfach ein Modell zum Erzeugen von
Baumobjekten. Um mit einem Baum programmtechnisch zu arbeiten, muß man ihn
konkretisieren, d. h. eine konkrete Instanz dieses Baums erzeugen. Jede
Bauminstanz kann unterschiedliche Eigenschaften haben (hat Blätter oder Nadeln,
582657400
-3-
Java
FH Merseburg SS 2002
blüht, trägt Früchte), während sie sich alle wie ein Baum verhalten und unmittelbar
als solcher zu erkennen sind.
Beim Erstellen der Klassen wird die eigentliche Programmierarbeit geleistet.
class Bankangestellter
Daten
Gehalt:
Name:
Alter:
Termine:
Methoden
beratenKunde()
...
abhebenGeld(aBetrag)
if aBetrag<>0
then
send Konto abbuchen ...
send Kassenautomat ...
else...
vereinbarenTermin()
....
582657400
-4-
Java
FH Merseburg SS 2002
Syntax:
class Motorrad {
String Marke;
String Farbe;
boolean Motorstatus;
void start() {
/* Methodenspezifikation
}
void Eigenschaften(){
/* Methodenspezifikation
}
public static void main (String args[]) {
/* Methodenspezifikation
}
}
1.3
Programmtechnische Sicht auf Objekte und Instanzen
In Java gehört jedes Objekt eindeutig zu einer Klasse. Um den Zusammenhang zu
kennzeichnen, wird das Objekt als Instanz dieser Klasse bezeichnet.
Eine (Klassen) Instanz ist ein eigentliches Objekt. Die Klasse ist die generische
Darstellung eines Objekts, eine Instanz ist die konkrete Darstellung.
Eine Klasseninstanz ist das eigentliche Objekt. Die Klasse ist die generische
(Gattungs-) Darstellung eines Objekts, eine Instanz ist die konkrete Darstellung.
Instanzen und Objekte stehen beide für die konkrete Darstellung einer Klasse. In
der OOP-Terminologie werden Instanz und Objekt synonym verwendet.
Klassen sind Strukturierungsmittel OO-Sprachen. Klassen bestehen aus zwei Teilen:


Attribute bzw. Variablen, die den Zustand von Objekten dieser Klasse
beschreiben und
Methoden, die das Verhalten der Objekte festlegen.
Klassen sind schachtelbar, da ihre Variablen vom Typ einer Klasse sein können.
Mit einem Java-Programm werden in der Regel mehrere Klassen entworfen und
implementiert. Wenn das Programm ausgeführt wird, werden nach Bedarf Instanzen
dieser Klassen erzeugt und wieder verworfen.
Motorrad m = new Motorrad();
582657400
-5-
Java
FH Merseburg SS 2002
Für viele Probleme beinhaltet die Java-Umgebung eine Bibliothek mit Klassen, die
einen Großteil des grundlegenden Verhaltens von Programmen implementieren, wie
beispielsweise E/-Operationen, grafische und mathematische Funktionen, Arrays,
Strings, Netzwerkoperationen usw.. Dies wird als Klassenbibliothek bezeichnet.
Eine Klassenbibliothek ist eine Sammlung von Klassen.
1.4
Attribute
Attribute sind die einzelnen Aspekte, die ein Objekt von einem anderen
unterscheiden und sein Erscheinungsbild, seinen Status oder andere
Eigenschaften festlegen.
Beispiel:
Attribute der
Farbe
Ausführung
Marke
hypothetischen Klasse PKW
Rot, Grün, Silbermetallic ....
Limousine, Kombi, Cabrio, Coupé .......
Honda, BMW, VW ......
Attribute werden durch Variablen definiert. Weil jede Instanz einer Klasse
unterschiedliche Werte für ihre Variablen haben kann, werden diese auch als
Instanzvariablen bezeichnet.
Eine Instanzvariable definiert die Attribute eines Objekts. Die Klasse definiert den
Typ der Attribute und jede Instanz speichert ihren eigenen Wert für dieses
Attribut in der Instanzvariablen.
Jedem Attribut ist eine Instanzvariable zugeordnet. Die Veränderung einer Variablen
ändert auch das Attribut dieses Objekts. Instanzvariablen können gesetzt werden,
wenn ein Objekt erzeugt wird, und die gesamte Lebensdauer des Objekts über
konstant bleiben, sie können aber auch bei der Programmausführung jederzeit
geändert werden.
String Marke;
String Farbe;
boolean Motorstatus;
Klassenvariablen entsprechen den globalen Variablen, die in allen Instanzen und
in der Klasse selbst zur Verfügung stehen. Anders als Instanzvariablen, deren
Werte in der Instanz abgelegt sind, werden die Werte der Klassenvariablen in der
Klasse gespeichert.
1.5
Methoden
582657400
-6-
Java
FH Merseburg SS 2002
Die Methoden einer Klasse legen fest, was die Instanzen dieser Klasse tun, um ihren
internen Status zu ändern, oder wie diese Instanz auf Nachrichten anderer Klassen
oder Objekte reagiert. Verhaltensweisen definieren, wie eine Klasse oder ein Objekt
mit dem restlichen Programm interagieren kann. Verhaltensweisen, die die
PKW-Klasse haben könnten, sind etwa Motor starten(), Motor abstellen(), Gas
geben(),oder Schalten().
Eine Methode ist ein Unterprogramm (Unterroutine, Funktion oder Prozedur), die
innerhalb einer Klasse definiert ist, und die für Instanzen dieser Klasse
ausgeführt wird.
Methoden beziehen sich nicht immer auf ein einzelnes Objekt. Unter Verwendung
von Methoden kommunizieren Objekte auch miteinander. Eine Klasse oder ein
Objekt kann Methoden einer anderen Klasse oder eines anderen Objekts aufrufen,
um Änderungen in der Umgebung mitzuteilen oder eine Statusänderung im Objekt
anzufordern.
void Eigenschaften() {
System.out.println("Das Motorrad ist eine " + Marke +
"Farbe: "+ color + ".");
if (Motorstatus == true)
System.out.println("Der Motor ist an.");
else System.out.println("Der Motor ist aus.");
}
...
m.Eigenschaften();
Wie Instanzvariablen und Klassenvariablen gibt es auch Instanzmethoden und
Klassenmethoden. Instanzmethoden (die in der Regel einfach nur als Methoden
bezeichnet werden) beziehen sich auf eine Instanz einer Klasse. Klassenmethoden
beziehen sich auf die Klasse selbst.
1.6
Nachrichten
Das dynamische Verhalten von OO-Systemen wird durch das Versenden von
Nachrichten beschrieben. Eine Nachricht stößt im Empfängerobjekt die
Durchführung einer Operation an. Die Nachricht gibt lediglich an, welche Operation
ausgeführt werden soll. Wie sie ausgeführt wird, liegt vollständig in der
Verantwortung des Empfängerobjektes und ist nach außen nicht sichtbar.
582657400
-7-
Java
FH Merseburg SS 2002
Objekt
Bankangestellter
Objekt
Kunde
Botschaft
Bankangestellter
Empfänger
abhebenGeld()
Selektor
500,-
Argumente
Operationen und Daten werden als unteilbare Einheit betrachtet. Objekte schützen
beide vor unerlaubtem Zugriff. Die Außenwelt sieht nur, welche Dienstleistungen
(Methoden) angeboten werden. Wie sie erbracht werden ist im Objekt verborgen.
Nur die eigenen Operationen eines Objektes können seinen eigenen Datenteil lesen
und schreiben, Methoden aus anderen Objekten können die Daten nicht mehr lesen
und verändern  Datenkapselung.
1.7
Vererbung
Verschiedene Klassen können Verhalten (Methoden) und Attribute (Variablen)
gemeinsam haben. In diesem Fall bietet es sich an, diese Gemeinsamkeiten von
einer zentralen Stelle aus zu verwalten.
Oberklasse
Unterklassen
Vererbung ist ein Mechanismus, der es ermöglicht, dass eine neue Klasse ihre
grundlegende Funktionalität von einer bereits existierenden Klasse erhält (erbt)
und basierend darauf eine neue Funktionalität aufbaut.
Eine Unterklasse erbt alle Methoden und Variablen von ihrer Oberklasse. Durch das
Anlegen einer Unterklasse müssen Attribute oder Verhalten nicht neu definiert oder
der Code aus der Oberklasse kopiert werden. Die Unterklasse erbt automatisch das
Verhalten von der Oberklasse, die ihr Verhalten von ihrer Oberklasse erbt usw. in
der Klassenhierarchie nach oben.
582657400
-8-
Java
FH Merseburg SS 2002
Dieses Prinzip ist aus der Klassifikation (z. B. Biologie) bekannt.
Lebewesen
Tiere
Insekten
Pflanzen
Wirbeltiere
Fische
Säugetiere
Katzen
Pferde
Durch die Vererbung wird eine Unterklasse zu einer Kombination aller in der
Klassenhierarchie weiter oben liegenden Funktionen.
class Bankangestellter
Daten
class Kreditberater extends Bankangestellter
Daten
Kreditlimit
Methoden
BewilligenKredit()
...
Gehalt:
Name:
Alter:
Termine:
Methoden
beratenKunde()
...
abhebenGeld(aBetrag)
...
vereinbarenTermin()
....
Ganz oben in der Java-Klassenhierarchie befindet sich die Klasse Object, die
allgemeinste Klasse der Hierarchie. Die Oberklasse Object definiert das Verhalten,
das alle anderen Klassen in der Java-Klassenhierarchie erben. Jede Unterklasse
582657400
-9-
Java
FH Merseburg SS 2002
weiter unten in der Hierarchie fügt weitere Informationen ein und wird für eine ganz
spezifische Aufgabe zugeschnitten.
Insofern werden ganz oben in der Hierarchie sehr abstrakte Konzepte definiert
werden, die auf dem Weg nach unten zu den Unterklassen immer konkreter werden.
Die Unterklassenbildung beschreibt das Erzeugen einer neuen Klasse (der
Unterklasse), die von einer anderen Klasse (ihrer Oberklasse) in der
Klassenhierarchie erbt. Durch die Unterklassenbildung müssen nur noch die
Unterschiede zwischen der neuen Unterklasse und ihrer Oberklasse zu definiert
werden, alle anderen Verhaltensweisen und Attribute stehen der neuen Klasse durch
die Vererbung zur Verfügung.
Definiert eine Klasse ein völlig neues Verhalten und ist damit eigentlich keine
Unterklasse einer bereits existierenden Klasse, erbt sie direkt von Object. Einer
Klassendefinition, die ihre Oberklasse in der Deklaration nicht angibt, wird
automatisch die Klasse Object als Standard-Oberklasse zugewiesen (z. B. Klasse
Motorrad).
Realisierungsprinzip der Vererbung
Für Instanzvariablen wird beim Erzeugen einer neuen Klasseninstanz für alle in der
aktuellen Klasse definierten Variablen sowie für alle in ihren Oberklassen definierten
Variablen zur Laufzeit Speicher zugewiesen. Auf diese Weise bilden alle Klassen in
ihrer Gesamtheit eine Schablone für das aktuelle Objekt und anschließend trägt
jedes Objekt die Information ein, die für die jeweilige Situation angemessen ist.
Methoden arbeiten ähnlich. Neue Objekte haben Zugriff auf alle Methoden ihrer
Klasse und ihrer Oberklassen, aber die Methodendefinitionen werden dynamisch
gewählt, wenn die Methode zur Laufzeit aufgerufen wird. Wenn also die Methode
eines bestimmten Objekts aufgerufen wird, prüft der Java-Interpreter zuerst, ob die
Methodendefinition in der Klasse dieses Objekts enthalten ist. Wenn dies nicht der
Fall ist, sucht er in der Oberklasse des Objekts nach und gegebenenfalls in der
Hierarchiekette nach oben, bis die Methode schließlich gefunden ist.
Methode X
Objekt
582657400
Methode X
Objekt
- 10 -
Java
FH Merseburg SS 2002
Vorteile der Vererbung:



Diskussion auf verschiedenen Abstraktionsniveaus möglich
Gemeinsamkeiten werden nur einmal beschrieben (Oberklasse)
Änderungen sind damit auch nur einmal notwendig und sind dann direkt in allen
Unterklassen wirksam
Unterklasse kann neues Verhalten und neue Operationen hinzufügen und
Ererbtes redefinieren

Beispiele für Klassen aus der Java - Klassenbibliothek

java.lang
Klassen, die sich auf die Sprache selbst beziehen, u.a. Object, Math, String,
System und Thread - außerdem Klassen für elementare Datentypen (int, char,
boolean und andere).
java.util
Utility - Klassen wie etwa Date und Random sowie einfache Auflistungsklassen
wie Vector oder Hashtable.
java.io
Eingabe- und Ausgabeklassen zum Lesen und Schreiben (wie Standardein- und ausgabe) und für die Verwaltung von Dateien.
java.net
Klassen für die Netzwerkunterstützung, u.a. Socket und URL
java.awt (Abstract Window Toolkit)
Klassen für die Implementierung einer grafischen Benutzeroberfläche, u.a.
Window, Menu, Button, Font, CheckBox sowie die Bildverarbeitung.
java.applet
Klassen für die Implementierung von Java - Applets. Ist Unterklasse von
java.awt und erbt somit auch dessen Funktionalität.






Neben den Java - Klassen enthalten die IDE´s weitere Klassen, die andere Utilities
oder Funktionalität bieten. Diese Klassen können praktisch sein, aber weil sie nicht
Teil der Standard – Java - Bibliothek sind, stehen sie anderen Personen für die
Ausführung der Java - Programme nicht unbedingt zur Verfügung.
1.8
Polymorphie
Polymorphie (griech.: viele Formen) beschreibt die Möglichkeit, daß sich eine
Methode in verschiedenen Klassen unterschiedlich verhalten kann. Verschiedene
Unterklassen können eine Methode ihrer Oberklasse neu realisieren.
Polymorphie ist bereits aus der prozeduralen Welt bekannt: die generischen
Operatoren wie + oder – sind sowohl auf integer - als auch auf float – Werte
anwendbar. (Operatoren sind im Grunde nichts anderes als Operationen mit
besonderem Namen.
Ein Aspekt der Polymorphie besteht folglich in der Variation der Schnittstelle
gleichnamiger Operationen:
582657400
- 11 -
Java
FH Merseburg SS 2002
Class Uhrzeit {
SetzeZeit (string z) {...}
SetzeZeit (int h, int m, int s) {...}
...
}
...
Uhrzeit wecker = new Uhrzeit();
...
wecker.SetzeZeit(20, 0, 30);
wecker.SetzeZeit(„20.00.30“);
In diesem Beispiel existieren zwei gleichnamige Operationen, die sich nur in ihrer
Signatur unterscheiden, d. h. mit anderen Parametern aufgerufen werden.
Die Signatur einer Methode ermöglicht, diese genau zu identifizieren. Die
Signatur besteht aus dem Namen der Methode, der Anzahl ihrer Argumente
sowie dem Typ der einzelnen Argumente.
Definiert eine Unterklasse eine Methode mit derselben Signatur wie in einer
Oberklasse, wird die Methodendefinition verwendet, die zuerst gefunden wird
(beginnend bei der Klasse des Objekts in der Hierarchie nach oben). Die Methode
der Unterklasse überschreibt die Methode der Oberklasse. Dies nennt man auch
statische Polymorphie.
Ausgangspunkt der dynamischen Polymorphie ist das Versenden einer Nachricht
(Aufruf einer Methode) an ein anderes Objekt. Je nach Zugehörigkeit zu einer Klasse
kann das Objekt unterschiedlich reagieren. Dies wird durch die sogenannte späte
Bindung realisiert, bei der der genaue Speicherort einer Operation erst dann
ermittelt wird, wenn der Aufruf stattfindet, d. h. eine entsprechende Nachricht an
das Objekt gesendet wird.
Beispiel:
class
GeoFigur {
double flaeche() {return 0.0 ; }
...
}
Die eigentlichen Formen für Quadrat, Rechteck und Kreis werden als Unterklasse
von GeoFigur abgeleitet. Jede dieser Klasse überschreibt die Methoden von GeoFigur
mit der für sie nötigen Funktionen.
class
Quadrat extends GeoFigur {
int a;
double flaeche() {return a * a ; }
...
}
class Rechteck extends GeoFigur {
int a, b;
double flaeche() {return a * b ; }
...
}
class Kreis extends GeoFigur {
double radius;
double flaeche() {return 2*Math.PI * radius * radius ; }
582657400
- 12 -
Java
FH Merseburg SS 2002
...
}
Programmcode ist nicht mit Fallunterscheidung realisiert, sondern auf übersichtliche
kleine Klassen aufgeteilt.
Als Unterklassen von GeoFigur können Instanzen der drei Klassen ohne Probleme
einer Variablen von GeoFigur zugewiesen werden:
GeoFigur gf1, gf2, gf3;
und neue Instanzen erzeugt werden
gf1 = new Quadrat (20);
gf2 = new Rechteck (20, 30);
gf3 = new Kreis (20);
Ein Aufruf der Methode flaeche() von GeoFigur auf einem beliebigen der Objekte
wird automatisch die korrekte Methode der jeweiligen Klasse ausgewählt:
double d = gf1.flaeche()
double e = gf2.flaeche()
double f = gf3.flaeche()
// 400
// 600
// 2*pi*400
So wird z. B. beim Aufruf von gf3.flaeche() automatisch die entsprechende Methode
der Klasse Kreis ausgeführt, da der variablen gf3 ein Objekt der Klasse Kreis
zugewiesen wurde. Polymorphie liefert also bei Aufruf einer Methode wie flaeche() in
Abhängigkeit von der konkreten Realisierung dieser Methode in der jeweiligen
Unterklasse ganz unterschiedliche und automatisch die richtigen Resultate.
582657400
- 13 -
Java
1.9
FH Merseburg SS 2002
Beziehungen zwischen Objekten und Klassen
 Vererbungsbeziehungen
Durch Vererbungsbeziehungen werden Generalisierung bzw. Spezialisierung
beschrieben. Eine Oberklasse ist eine Generalisierung ihrer Unterklasse. Eine
Unterklasse ist eine Spezialisierung ihrer Oberklasse.
 Assoziationen
Assoziationen
beschreiben
dauerhafte
Beziehungen
zwischen
Objekten
verschiedener Klassen. Assoziationen werden auch als „Benutzt – Beziehungen“
bezeichnet.
Ein Beispiel ist die Beziehung zwischen einem Objekt Firma und einem Objekt
Mitarbeiter.
class Filiale
sichert
Schutzobjekt
class Wachdienst
Wächter
reinigt
class Putzmann
 Aggregationen
Aggregationen beschreiben ebenfalls dauerhafte Beziehungen zwischen Objekten
verschiedener Klassen, im Unterschied zu Assoziationen aber in einer Beziehung wie
ein Ganzes zu seinen Teilen. Aggregationen werden auch als „Ganzes – Teil –
Beziehungen“ bezeichnet (besondere Variante der Assoziation).
Auto – Motor, Lenkrad, Räder etc.
Unternehmen – Abteilung – Mitarbeiter etc.
Komposition
Besondere Art der Aggregation: Einzelteile sind vom Aggregat existenzabhängig.
Beispiel: Rechnungsposition von der Rechnung
 Nachrichtenbeziehungen
Die Kommunikation der Objekte geschieht über den Austausch von Nachrichten. Die
Objekte senden sich untereinander Nachrichten zu, die zu den Operationen
(Methoden) führen. Ein Objekt versteht genau die Nachrichten, zu denen es
Operationen besitzt.
582657400
- 14 -
Java
FH Merseburg SS 2002
Beispiel:
Es existieren Klassen Rechteck mit setA() und setB() und Kreis mit setRadius(),
beide abgeleitet von GeoFigur. Beziehungen von Kreiseck zu Klassen Rechteck und
Kreis werden nun betrachtet:
class KreisEck extends GeoFigur {
Kreis k;
Rechteck r;
public void anzeigen() {
k.anzeigen();
r.anzeigen();
}
...
public void setA (int neuA) {
k.setRadius(neuA/2);
r.setA(neuA);
r.setB(neuA);
}
....
public void vergroessern(float faktor) {
int a;
a = r.getA();
setA(a * faktor);
}
Das Objekt KreisEck erzeugt innerhalb der Methode vergroessern() eine Nachricht
an sich selbst (setA()), die wiederum weitere Nachrichten an Kreis und Rechteck
erzeugt.
Nachrichten in OO - Programmen unterscheiden sich von Funktionsaufrufen in
prozeduralen Sprachen durch:



Daten und Methoden bilden eine Einheit – Methoden / Nachrichten lassen sich
nur über das Objekt ansprechen.
Objektattribut sind gekapselt und nach außen nur über Methoden des Objektes
zugänglich
Eine Nachricht kann von einem Objekt nur interpretiert werden, wenn es dazu
eine passende Methode besitzt
***
582657400
- 15 -
Herunterladen