Beruflich Dokumente
Kultur Dokumente
4.6 Gemischtes
4-21 (80)
4-22 (81)
4.6 Gemischtes
Frage: Wie kann man Konstanten definieren?
Frage: Java ist plattformunabhngig. Wie komme ich trotzdem an Informationen ber das Betriebssystem?
Deklariert man ein Klassenattribut oder Objektattribut mit dem Modifizierer final, so kann das Attribut
nach der erstmaligen Initialisierung nicht mehr gendert werden.
Frage: Wie kann man abfragen, von welcher Klasse ein Objekt erzeugt wurde?
Antwort: Mit Hilfe der Methode getClass() oder mit dem Operator instanceof.
32
33
34
35
36
Objektorientierung/Autos/09-instanceof/Auto.java
System.out.println(bmw.getClass());
// Ausgabe: class Auto
if (bmw instanceof Auto)
System.out.println("ist ein Auto");
if ("FIAT" instanceof String)
System.out.println("ist ein String");
4-23 (82)
Inhalt
5-1 (83)
5-2 (84)
5-3 (85)
Inhalt / Ziele: Wir lernen weitere Konzepte des objektorientierten Softwareentwurfs kennen. Wie konzentrieren uns dabei auf die Frage, wie in Java Vererbung, Interfaces, Zugriffsrechte, Packages usw. realisiert werden.
Bei der Abbildung der realen Welt nach Software lassen sich oft Hierarchien ausnutzen:
Oberklasse (Superklasse)
Gelndewagen
Auto
Sportwagen
Limousine
Unterklassen (Subklassen)
Frage:
Das Bild gibt eine Klassenhierarchie wieder. Die Subklassen Gelndewagen, Sportwagen und
Limousine erben von der Superklasse Auto. (Subklasse = Unterklasse, Superklasse = Oberklasse)
Vererbung
Eine Subklasse erbt Attribute und Methoden von ihrer Superklasse (z. B. tachoStand,
fahren(double distanz). Sie kann diese verwenden, als wren sie in der Subklasse selbst
deklariert.
Wir haben gelernt, dass objektorientierte Sprachen wie Java Attribute und Methoden in Klassen vereinigen
und dass Datenkapselung fr die Einhaltung der Zusicherungen sorgt.
5-4 (86)
Spezialisierung: In den Subklassen knnen die Methoden und Attribute der Superklasse entweder wiederverwendet oder berlagert werden. Zustzlich drfen die Subklassen um neue Methoden und
Attribute ergnzt werden.
Weitervererbung: Subklassen knnen selber weitervererbt werden. Soll eine Klasse nicht mehr weiter
vererbt werden knnen, kennzeichnet man dies durch das Schlsselwort final. Genauso kann man
das berlagern von Attributen und Methoden durch eine Subklasse verbieten.
Mehrfachvererbung: Java untersttzt keine Mehrfachvererbung, also das Erben von mehreren Superklassen. Als Alternative gibt es die so genannten Interfaces.
Abstrakte Klassen: Es besteht die Mglichkeit, Klassen so zu definieren, dass erst die Subklassen die
Definitionen mit Leben fllen mssen. Man kann diese Klassen erkennen an dem Schlsselwort
abstract. Solche Klassen knnen nicht instantiiert werden.
In Java wird das Schlsselwort extends verwendet, um von anderen Klassen zu erben.
6
7
9
12
13
14
15
29
30
31
32
33
35
36
39
40
43
Objektorientierung/Autos/10-Vererbung/Limousine.java
public class Limousine extends Auto
{
int sicherheitsKategorie;
public Limousine()
{
this.sicherheitsKategorie = 3;
}
public void setzeSicherheitsKategorie(int sicherheitsKategorie)
{
if ((sicherheitsKategorie > 0) && (sicherheitsKategorie < 4))
this.sicherheitsKategorie = sicherheitsKategorie;
}
public int leseSicherheitsKategorie()
{ return this.sicherheitsKategorie; }
public void ausgeben()
{
}
5-5 (87)
5-6 (88)
Quelltextanalyse
Tier
alter
atmen()
schlafen()
essen()
leseSicherheitsKategorie()
berlagerung: Die Methode ausgeben() der Superklasse Auto wird neu definiert und erhlt eine
andere Implementierung.
berlagerung
Wo ist welche
Operation definiert?
Fleischfresser
essen()
jason: Katze
alter: 7
<<instance of>>
schlafen()
jagen()
schnurren()
5-8 (90)
5.2.1 Typkonvertierungen
Kann man eine Referenz vom Typ Auto auf eine Instanz vom Typ Limousine verweisen lassen?
Und umgekehrt?
52
56
Objektorientierung/Autos/10-Vererbung/Limousine.java
Limousine jaguar = new Limousine();
Auto meinPKW = new Auto();
meinPKW = jaguar;
5-9 (91)
Die Umwandlung eines Referenzdatentyps in eine seiner Subklassen nennen wir einschrnkende
Konvertierung. Sie muss mit dem Type-Cast-Operator vorgenommen werden und erfordert sorgfltige
Behandlung:
64
68
77
Die Umwandlung eines Referenzdatentyps in eine seiner Superklassen nennen wir erweiternde Konvertierung.
int m;
byte j = 120;
m = j;
60
atmen()
schlafen()
essen()
jagen()
schnurren()
Erweiternde Konvertierungen werden in Java automatisch vorgenommen. Dies kennen wir schon bei
einfachen Datentypen:
48
5-7 (89)
5-10 (92)
5-11 (93)
Objektorientierung/BindTest/1/BindTest.java
Frage: Welche Methoden ruft ein konvertiertes Objekt auf? Die der Subklasse oder die der Superklasse?
Oberklasse
inhalt
drucke()
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Oberklasse
{
String inhalt = "Attribut Oberklasse";
public void drucke() { System.out.println("Methode
Oberklasse" + "\n"); }
}
class Unterklasse extends Oberklasse
{
// berlagerung eines Attributs
String inhalt = "Attribut Unterklasse";
// berlagerung einer Methode
public void drucke() { System.out.println("Methode
Unterklasse" + "\n"); }
Welche Merkmale sind gemeint, wenn ein Objekt o der Superklasse ein Objekt u der Subklasse
zugewiesen bekommt?
berlagert
Welche Merkmale sind gemeint, wenn ein Objekt u der Subklasse als ein Objekt der Superklasse
verwendet wird?
Unterklasse
inhalt
drucke()
11
12
13
14
15
16
17
18
19
20
21
22
23
24
5-12 (94)
39
40
41
42
43
Objektorientierung/Autos/10-Vererbung/Limousine.java
public void ausgeben()
{
super.ausgeben();
System.out.println("Kategorie = " + sicherheitsKategorie);
}
Objektorientierung/BindTest/2-super/BindTest.java
37
38
39
40
41
44
45
46
47
48
11
12
13
14
15
16
17
5-13 (95)
5-14 (96)
Ist die erste Anweisung eines Konstruktors eine normale Anweisung also kein Aufruf von this()
oder super() so ergnzt Java automatisch einen impliziten Aufruf von super() zum Aufruf
des Standardkonstruktors der Superklasse.
Nach Rckkehr von diesem Aufruf initialisiert Java die Instanzattribute der aktuellen Klasse und fhrt
mit der Ausfhrung der Anweisungen des aktuellen Konstruktors fort.
Ist die erste Anweisung eines Konstruktors der Aufruf eines Superklassenkonstruktors ber super(),
ruft Java den gewnschten Superklassenkonstruktor auf.
Nach Rckkehr von diesem Aufruf initialisiert Java die Instanzattribute der aktuellen Klasse und fhrt
mit der Ausfhrung der Anweisungen des aktuellen Konstruktors fort.
Ist die erste Anweisung eines Konstruktors der Aufruf eines berladenen Konstruktors ber this(),
ruft Java den gewnschten Konstruktor auf und fhrt danach einfach die Anweisungen im aktuellen
Konstruktor aus.
Der Aufruf des Superklassenkonstruktors vollzieht sich explizit oder implizit innerhalb des berladenen Konstruktors, so dass die Initialisierung der Instanzvariablen bereits dort stattgefunden hat.
18
19
20
21
22
23
24
5.3 Datenkapselung
5-15 (97)
Objektorientierung/Autos/10-Vererbung/Limousine.java
public Limousine(double tachoStand, int sicherheitsKategorie)
{
super(tachoStand);
if ((sicherheitsKategorie > 0) && (sicherheitsKategorie < 4))
this.sicherheitsKategorie = sicherheitsKategorie;
else
this.sicherheitsKategorie = 3;
}
5.3 Datenkapselung
Designmerkmale einer objektorientierten Sprache wie Java:
Klassen vereinigen Attribute, Methoden und Zusicherungen.
Vererbung erlaubt das bertragen von Merkmalen vorhandener Klassen auf neue Klassen.
Datenkapselung durch Zugriffsrechte.
5.3 Datenkapselung
5-16 (98)
Klassen, ihre Attribute und Methoden knnen durch Zugriffsbezeichner modifiziert werden. Durch diese
Bezeichner kann man die Zugriffsrechte und -mglichkeiten genauer definieren.
Schlsselwort Beispiel
private
protected
public
private int i;
protected int i;
int i;
public int i;
10
11
27
28
41
42
13
14
15
5.4 Packages
5-17 (99)
5.4 Packages
Ein Package ist eine Sammlung verwandter Klassen, die Zugriffsrechte und Namensgebung verwaltet.
Objektorientierung/Geld/1/Sparstrumpf.java
// Auf k kann von auen nicht zugegriffen werden.
private float k;
// Eine Methode, die von auen aufgerufen werden kann.
public float auszahlen(float r)
// Eine Methode, die nicht von auen aufgerufen werden kann.
private void umrechnenYen()
Objektorientierung/Geld/1/Test.java
bar = s.auszahlen(1000);
// System.out.println("Kapital = " + s.k); // Fehler b. Compilieren
// s.umrechnenYen();
// Fehler b. Compilieren
Es gibt im JDK bereits eine Reihe ntzlicher Packages, z. B. java.applet, java.awt, java.io,
java.net, javax.swing usw.
Das Package java.lang wird automatisch eingebunden. Es enthlt neben den elementaren Sprachkonstrukten auch die Klassen Math (3.7), System (4.6), Thread (13), Object (5.9), Class (5.9)
sowie diverse Wrapperklassen (5.10) fr einfache Datentypen.
Man kann natrlich auch eigene Packages erstellen.
Man kann Packages einbinden durch die Anweisung import.
Objektorientierung/Packages/Test.java
import autos.*;
Man kann Packages erzeugen durch die Anweisung package.
Objektorientierung/Packages/autos/Auto.java
1 package autos;
Objektorientierung/Packages/autos/Limousine.java
1 package autos;
1
5.4 Packages
5-18 (100)
Objektorientierung/Packages/Test2.java
autos.Limousine jaguar = new autos.Limousine();
Ab Java 5 kann bei einer statischen Funktion auf die Qualifikation durch den Klassennamen
verzichtet werden, wenn diese statisch importiert wird (siehe 3.7).
7
5-19 (101)
Man kann Packages auch ohne import verwenden, wenn man den Klassennamen vollstndig
qualifiziert.
10
Grundlagen/Math/MathBsp3.java
import static java.lang.Math.*;
Zugriff von
auf A/M mit Zugriffsrecht Klasse Unterklasse Package fremde Klasse
Trifft der Compiler javac auf eine import-Anweisung, so durchsucht er den CLASSPATH, um die
Verzeichnisse mit den Packages zu finden.
private
protected
package
public
Der Suchpfad kann beim Aufruf des Compilers mit der Option -classpath angegeben werden.
Gibt man beim Aufruf keinen speziellen Pfad an, so wird zuerst das aktuelle Verzeichnis und dann
das Standardverzeichnis der mitgelieferten JDK-Packages durchsucht.
Bentigt der Compiler Klassen, die noch nicht compiliert sind, so werden diese automatisch mit
bersetzt.
4
4
4
4
4
4
5-20 (102)
5-21 (103)
6
7
8
9
Objektorientierung/Geld/2/Wertpapier.java
public abstract class Wertpapier
{
public abstract float berechneWert();
}
Quelltextanalyse
Das Schlsselwort abstract kennzeichnet eine Klasse oder Methode als abstrakt.
Bei einer abstrakten Methode ersetzt ein Semikolon den Methodenkrper.
Eine abstrakte Klasse kann neben abstrakten Methoden durchaus normale (nicht abstrakte) Attribute und Methoden enthalten.
Von einer abstrakten Klasse knnen keine Instanzen gebildet werden.
Problem:
Es soll ein Wertpapierdepot verwaltet werden. Alle Wertpapiere sollen ber eine Methode
berechneWert() verfgen. Der Wert eines Sparbuchs berechnet sich aber ganz anders als der
von Aktien.
Wir sollten eine abstrakte Klasse Wertpapier mit einer abstrakten Methode berechneWert()
deklarieren. Jede Klasse, die davon erben will, muss dann eine konkrete Implementierung vornehmen.
5-22 (104)
5.8 Interfaces
5-23 (105)
6
25
26
27
28
29
30
31
5.8 Interfaces
Objektorientierung/Geld/2/Sparbuch.java
public class Sparbuch extends Wertpapier
public float berechneWert()
{
float wert = k;
for (int i = 1; i <= l; i++)
wert = wert * (1 + p);
return wert;
}
Problem: Die Steuererklrung steht an. Es sollte fr Autos, Sparbcher und Hunde eine einheitliche Methode berechneSteuer() geben. Leider gehren die Klassen zu verschiedenen Vererbungshierarchien.
Objektorientierung/Geld/2/Aktie.java
17
18
19
20
Quelltextanalyse
Wir mssen dann die abstrakte Methode public float berechneWert() implementieren.
Nehmen wir einmal an, dass wir die folgenden Vererbungshierarchien aufgebaut haben:
Fr eine abgeleitete Klasse Aktie kann eine ganz andere Implementierung der Methode vorgenommen werden.
Object
Tier
Fleischfresser
Object
Auto
Limousine
Object
Wertpapier
Sparbuch
Hund
Objektorientierung/Geld/2/Depot.java
Sparbuch sb = new Sparbuch(5112.92f, 0.0125f, 5);
System.out.println(sb.berechneWert());
10
11
Siehe Objektorientierung/Interfaces.
5.8 Interfaces
5-24 (106)
Nun mchten wir unsere Steuererklrung in Java programmieren. Zu versteuern sind alle Instanzen
der Klassen Hund, Auto und Sparbuch.
Es wre ntzlich, wenn fr jede dieser Klassen eine Methode berechneSteuer() zur Verfgung
stnde.
Mit der Hilfe von Interfaces bietet Java eine Konstruktion an, um solche Anforderungen zu lsen:
Wir erstellen zunchst ein Interface Steuer.
6
7
8
9
6
7
18
19
20
21
22
23
Eine Klasse, die das Interface benutzen will, zeigt dies durch das Schlsselwort implements an.
Wir mssen dann alle Methoden des Interfaces implementieren, es sei denn, die implementierende
Klasse ist abstrakt.
Objektorientierung/Interfaces/Hund.java
public class Hund extends Fleischfresser implements Steuer
{
public double berechneSteuer()
{
double steuerBetrag = 120;
return steuerBetrag;
}
}
Siehe Objektorientierung/Interfaces/Auto.java.
Siehe Objektorientierung/Interfaces/Limousine.java.
Nun verfgen alle Objekte dieser Klassen ber eine Methode berechneSteuer(), die man so
verwenden kann:
5-25 (107)
Siehe Objektorientierung/Interfaces/Sparbuch.java.
Objektorientierung/Interfaces/Steuer.java
public interface Steuer
{
double berechneSteuer();
}
Dort listen wir die Methoden auf, die implementiert werden mssen, wenn wir das Interface benutzen
wollen.
5.8 Interfaces
10
11
15
16
17
18
Objektorientierung/Interfaces/Test.java
Hund bello = new Hund();
Sparbuch sb = new Sparbuch(1200, 0.015f, 1);
double steuern;
steuern = bello.berechneSteuer();
System.out.println(steuern);
steuern += sb.berechneSteuer();