FH D

Werbung
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vorlesung: 16:00-16:45/Pause/17:00-17:45
 Dipl.-Ing. in Elektrotechnik, Fachrichtung
Nachrichtentechnik
 Wissenschaftler am Fraunhofer Institut
FIT, Forschungsbereich Augmented Reality
 Wissenschaftlicher Angestellter im
FB3/FB4 der FH Düsseldorf, Fachgebiet
Mustererkennung
 Dr.-Ing. in Elektrotechnik, Fachgebiet
Maschinelle Lernverfahren
André Stuhlsatz
 Prof. Dr.-Ing. in Informatik
(nebenberuflich) seit 2014
 Entwicklungsingenieur (hauptberuflich)
bei SMS Siemag AG
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik Team
 Informatik 1:
 Prof. Dr.-Ing. Thomas Zielke
 Informatik 2:
 Prof. Dr.-Ing. André Stuhlsatz
 Raum S4
 Sprechzeit: Mittwochs 13-14 Uhr
 Immer erreichbar via E-Mail:
[email protected]
 Oder wissenschaftliche Mitarbeiter,
Raum S1a :
 M.Sc. Jens Lippel
 B.Eng. Janika Merz
 Oder Tutorensprechstunde:
Di. 16h, Mi. 14h & Do. 8:30h
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vorlesungsunterlagen
 Vorlesung:
 PowerPoint Folien  http://mv.fh-duesseldorf.de/d_pers/informatik
 Wird regelmäßig aktualisiert.
 Dort finden Sie auch Programmierbeispiele (Netbeans Projekte)
 Klausuren:
 Alle Klausuren als PDF-Datei
 Lösung der letzten Klausur (WS 2013/2014)
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vorlesungsunterlagen
 Anwesenheit wird dringend
empfohlen!
 Folien sind Stichwortsammlung
 Zusätzlich werden wichtige
Lehrinhalte erläutert
 Tipp: Nicht alles abschreiben,
sondern selbst ergänzen!
 Letzte Vorlesung: Probeklausur
 Klausur: max. 48 Punkte, keine
Kofferklausur, sondern einseitig
handgeschriebener A4-Merkzettel
Informatik 2
5
FH D
Praktikum
Fachhochschule Düsseldorf
University of Applied Sciences
 Unterlagen und Information auf der Internetseite!
 Beginnt ab 17.03.2014
 Endgültige Gruppeneinteilung für das Info II Praktikum im Schaukasten
neben S1a
 4 Präsenztermine (4P) / 3 Projektaufgaben (15P) / 1 Abschlussprojekt (5P):
 Präsenztermin: Praktische Programmierübung unter Betreuung
(Anwesenheitspflicht!)
 Projektaufgabe: Eigenständig zu bearbeitende Aufgaben zw.
Präsenzterminen / Aufgabenstellung jeweils nach Präsenztermin
 Abschlussprojekt: Größeres Projekt (freiwillig, jedoch für max. Punktzahl
notwendig!)
 Fragen zum Praktikum beantwortet Hr. Lippel oder Fr. Merz (Raum S1a).
Informatik 2
6
FH D
Literatur
Fachhochschule Düsseldorf
University of Applied Sciences
 Handbuch der Java-Programmierung
 Guido Krüger, Thomas Stark
 Gebundene Ausgabe: 1280 Seiten
 Verlag: Addison-Wesley, München; Auflage: 5.
Auflage (28. November 2007)
 Sprache: Deutsch
 ISBN-10: 3827323738
 Die HTML Ausgabe des Buches ist auch
kostenlos verfügbar:
 www.javabuch.de
 Java ist auch eine Insel
 Christian Ullenboom
 Geb. Ausgabe: 1308 S.
 Galileo Computing,
 Sprache: Deutsch
 ISBN-10: 3836228734
 Online kostenlos:
http://openbook.galileocomputing.de/javainsel/
Informatik 2
 The Java® Language Specification
 Sprache: Deutsch
 http://docs.oracle.com/javase/
specs/jls/se7/html/index.html
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Entwicklungsumgebung
 In der Vorlesung wird die kostenlose Entwicklungsumgebung
NetBeans verwendet: http://netbeans.org/downloads/
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2: Java
 Java ist eine objektorientierte Programmiersprache.
 Vergleich C vs. Java
 Syntax ist ähnlich (logische Ausdrücke, Schleifen)
 Konzept der Programmierung ist grundlegend anders
 Warum Java
 Java ist kostenlos
 Java ist plattformunabhängig
 Für Java gibt es schon viele Programme, die Sie
auch verwenden können.
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Objektorientierung
 Objektorientierung ist ein Entwicklungskonzept für Software
 Programmierparadigma (zugrundeliegendes Prinzip)
 Daten werden klassifiziert nach Eigenschaften, Verhalten und Operationen.
 Organisationsstrukturen oder reale „Dinge“ (Objekte) werden nachgebildet.
 Objekte sind subjektiv
 Was ein Objekt ist und was es für wichtige Eigenschaften und Verhalten hat,
hängt von der Wahrnehmungsweise ab.
 Objekte sind eigenständig und können mit anderen Objekten
interagieren/kommunizieren.
 Beispiel: Motorrad
 Händler: Baujahr, Preis
 Kunde: Leistung, Fahreigenschaften
 Finanzamt: Hubraum, CO2 Ausstoß
 Versicherung: Leistung, Unfälle
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Abstraktion: Klasse
 Ein Objekt aus der realen Welt wird abstrahiert und dessen allgemeiner
Bauplan als Klassendefinition implementiert.
 Aus dieser Klasse können viele verschiedene Objekte (Instanzen einer Klasse)
erzeugt werden.
 Zur Definition einer Klasse gehören
 Attribute:
Eigenschaften des Objektes
 Methoden: Verhalten des Objektes
 Jetzt ein paar Beispiele ohne konkrete Implementierung!
Informatik 2
11
FH D
Beispiel: Fußballspieler
Fachhochschule Düsseldorf
University of Applied Sciences
Reales System: Fußballmannschaft
Abstrakter:
Eine Spieler-Klasse, davon 11 Instanzen
Attribute
Spiele:
Tore:
in:
out:
Name:
Nummer:
Zahl 0…100
Zahl 0..22
Zahl 0..22
Zahl 0..22
Zeichenkette
Zahl
Methoden:
„Schieße auf das Tor“
„Ein Rote Karte mehr“
„Auswechseln“
Informatik 2
12
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
v1
SMS SIEMAG: Bandposition in Walzstraße
v2
v3
 Bandkopf wird beim
Walzen schneller
(Massenerhalt)
 Wann sind die
Bandköpfe wo?
 Objekte:
 Walzen
 Band
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Einfaches Java Programm
 Dieses einfache Java Programm gibt eine Meldung auf dem Bildschirm aus
public class Anwendung {
public static void main(String[] args) {
System.out.println("Erstes Beispiel");
}
}
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Die Klasse „Anwendung“
public class Anwendung {
public static void main(String[] args) {
System.out.println("Erstes Beispiel");
}
}
 public:
 Sichtbarkeit „öffentlich“ – erst mal machen wir alles öffentlich.
 class:
 Klasse, Schlüsselwort von Java
 Anwendung:
 Name der Klasse. Auch gleich Dateinamen „Anwendung.java“
 {…}:
 Block. Alles zwischen den geschweiften Klammern gehört zur Klasse
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
main Methode
public class Anwendung {
public static void main(String[] args) {
System.out.println("Erstes Beispiel");
}
}
 public:
 Sichtbarkeit „öffentlich“ – erst mal machen wir alles öffentlich.
 static:
 Zugriff direkt ohne Objekt möglich  später mehr dazu…
 void:
 Rückgabetyp. Die Methode gibt nichts zurück
 main(String[] args) :
 Dies ist das Hauptprogramm. Eventuell werden aus der Kommandozeile
Zeichenketten als Übergabeparameter bereitgestellt  später…
 {…}:
 Block. Alles zwischen den geschweiften Klammern gehört zur Methode
Informatik 2
16
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse für Eigenschaften von Spieler
 Spieler:
 Jeder Spieler einer
Fußballmannschaft soll
einen Namen und eine
Spielstärke haben.
public class Spieler {
int spielstärke;
String name;
}
 Deklaration von Variablen:
 <Datentyp> <Variablenname>;
 Es ist nun der „Bauplan“ für einen Spieler gegeben.
Es gibt aber noch keine Spieler!
 Spieler müssen erst noch erzeugt werden:
 <Klassenname> <Variablenname>;
<Variablenname> = new <Klassenname> ();
 <Klassenname> <Variablenname> = new <Klassenname> ();
 Spieler mittelFeld = new Spieler();
Informatik 2
17
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Ein Spieler wird erzeugt und bekommt einen Namen
Spieler.java
public class Spieler {
int spielstärke;
String name;
}
Anwendung.java
public class Anwendung {
public static void main(String[] args){
Spieler mittelFeld = new Spieler();
mittelFeld.name = "Jim Knopf";
}
}
 Zugriff auf Eigenschaften und Methoden mit „.“
 <Variablenname>.<Eigenschaft>
 mittelFeld.name = "Jim Knopf";
Informatik 2
18
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Erstes Programmbeispiel
public class Spieler {
int spielstärke;
String name;
}
public class Anwendung {
public static void main(String[] args) {
Spieler mittelFeld = new Spieler();
mittelFeld.name = "Jim Knopf";
mittelFeld.spielstärke = 57;
System.out.println("Die Spielstärke von " +
mittelFeld.name +
" ist " +
mittelFeld.spielstärke);
}
}
Informatik 2
19
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Mehrere Spieler
 Es können mehrere Instanzen (Objekte) der Klasse Spieler erzeugt werden.
 Jede Instanz hat ihre eigenen Eigenschaften.
 Eine Instanz weiß nicht, ob es noch andere Instanzen seiner Klasse gibt.
public class Anwendung {
public static void main(String[] args) {
Spieler mittelFeld = new Spieler();
Spieler abwehr
= new Spieler();
Spieler sturm
= new Spieler();
mittelFeld.name
abwehr.name
sturm.name
= "Jim Knopf";
= "Lukas Loko";
= "Max Mahlzahn";
}
Informatik 2
20
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Methoden einer Klasse
public class Spieler {
int spielstärke;
String name;
public void zeigeInfo() {
System.out.println("Die Spielstärke von " +
name +
" ist " +
spielstärke);
}
}
 Methoden sind die „Funktionen“ einer Klasse.
 Diese Methoden werden i.d.R. verwendet, um auf die internen Attribute
lesend oder schreibend zuzugreifen.
 Methoden können mehrere oder keine Übergabewertehaben haben
 Methoden können einen oder keinen Rückgabewert haben.
 Auf die Methoden wird durch den Punktoperator zugegriffen:
 Beispiel: mittelFeld.zeigeInfo()
Informatik 2
21
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
v1
SMS SIEMAG: Walzstraße
v2
v3
 Objekte:
 Walzen
 Lager
 Gerüst
 Spindel
 Antriebsmotor
 Getriebe
Informatik 2
2
FH D
Wiederholung: Klasse definieren
Fachhochschule Düsseldorf
University of Applied Sciences
 Die Klasse Walze hat Attribute und Methoden:
public class Walze {
Attribut
double durchmesser;
String hersteller;
// und mehr
Methode
public void zeigeInfo() {
System.out.println(„Hersteller=" +
hersteller +
„%nDurchmesser= " +
durchmesser);
}
}
Informatik 2
3
FH D
Wiederholung: Instanz der Klasse erzeugen
Fachhochschule Düsseldorf
University of Applied Sciences
1. Variable vom Objekttyp Walze definieren und neue Instanz erzeugen.
2. Attribute mit Inhalten füllen.
3. Methoden aufrufen.
public class Walzwerk {
1.
public static void main(String[] args) {
Walze arbeitswalze = new Walze();
2.
arbeitswalze.hersteller = „SMS Siemag AG";
arbeitswalze.durchmesser = 210.0;
// etc.
3.
arbeitswalze.zeigeInfo();
}
}
Informatik 2
4
FH D
Initialisieren von Attributen
Fachhochschule Düsseldorf
University of Applied Sciences
 Das bisherige Verfahren ist umständlich und fehleranfällig:
 Attribute müssen einzeln gesetzt werden.
 Welche Attribute sind wichtig?
 Welche Attribute sollen mit Standardwerten belegt werden?
 Nächster Ansatz:
 Es wird eine Methode für die Initialisierung geschrieben:
public class Walze {
double durchmesser;
String hersteller;
public void initWalze(
double durchm,
String herst) {
durchmesser = durchm;
hersteller = herst;
}
}
Informatik 2
5
FH D
Programmänderung: Aufruf der Initialisierung
Fachhochschule Düsseldorf
University of Applied Sciences
1. Variable vom Objekttyp Walze definieren und neue Instanz erzeugen.
2. Attribute mit Inhalten füllen.
3. Methoden aufrufen.
public class Walzwerk{
public static void main(String[] args) {
Walze arbeitswalze = new Walze();
1.
2.
walze.initWalze(210.0, „SMS Siemag AG");
3.
walze.zeigeInfo();
}
}
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wichtiger Unterschied: Attribute vs. Methoden
 Die Attribute und Methoden eines Objektes werden mit den Punkt-Operator
angesprochen.
 Wichtiger Unterschied:
 Attribute haben keine Klammer.
 Methoden haben immer eine Klammer (wg. Übergabeparameter).
public class Walzwerk {
public static void main(String[] args) {
Walze arbeitswalze = new Walze();
Keine
Klammer
arbeitswalze.hersteller = „SMS Siemag AG";
arbeitswalze.durchmesser = 210.0;
Klammer
arbeitswalze.zeigeInfo();
}
}
Informatik 2
7
FH D
Variablen
Fachhochschule Düsseldorf
University of Applied Sciences
 In Java werden drei Typen unterschieden:
1. Instanzvariablen, die im Rahmen einer Klassendefinition definiert und
zusammen mit dem Objekt angelegt werden.
2. Klassenvariablen, die ebenfalls im Rahmen einer Klassendefinition definiert
werden, aber unabhängig von einem konkreten Objekt existieren.  später
3. Lokale Variablen, die innerhalb einer Methode oder eines Blocks definiert
werden und nur dort existieren.
public class Walze {
1.
double durchmesser;
String hersteller;
public void initWalze(double neu_durchmesser,
String neu_hersteller) {
durchmesser = neu_durchmesser;
hersteller = neu_hersteller;
}
1.
3.
3.
}
Informatik 2
8
FH D
Überdecken von Variablen
Fachhochschule Düsseldorf
University of Applied Sciences
 Lokale Variablen und Instanz- oder Klassenvariablen können
denselben Namen haben.
 Überdeckte Instanz- oder Klassenvariablen werden mit this angesprochen:
 Beispiel: this.durchmesser = durchmesser;
public class Walze {
double durchmesser;
String hersteller;
public void initWalze(double durchmesser,
String hersteller) {
this. durchmesser = durchmesser;
this. hersteller = hersteller;
}
}
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Initialisierung mit Konstruktor
 Bisher: Erst Instanz erzeugen, dann Instanzvariablen initialisieren.
public class Walzwerk {
public static void main(String[] args) {
Walze arbeitswalze = new Walze();
arbeitswalze.initWalze(210.0, „SMS Siemag AG");
arbeitswalze.zeigeInfo();
}
}
 Zukünftig mit Konstruktor: Alles in einer Zeile:
public class Walzwerk {
public static void main(String[] args) {
Walze arbeitswalze = new Walze(210.0, „SMS Siemag AG");
arbeitswalze.zeigeInfo();
}
}
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Implementierung eines Konstruktors
 Ein Konstruktor wird immer dann aufgerufen, wenn eine Instanz der Klasse
erzeugt wird.
 Ein Konstruktor ist eine Methode:
 Der Name des Konstruktors muss identisch mit dem Klassennamen sein.
 Der Datentyp des Rückgabeparameter muss weggelassen werden.
public class Walze {
double durchmesser;
String hersteller;
public Walze(double durchmesser,
String hersteller) {
this.durchmesser = durchmesser;
this.hersteller = hersteller;
}
}
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Überladen von Konstruktoren
 Es ist möglich mehrere Konstruktoren zu definieren, um beispielsweise nur
einige Instanzvariablen mit Startwerten zu belegen.
 Die Parameterliste der Konstruktoren muss sich dabei in Anzahl oder
Datentyp unterscheiden.
public class Walze {
double durchmesser;
String hersteller;
public Walze(double durchmesser,
String hersteller) {
this.durchmesser = durchmesser;
this.hersteller = hersteller;
}
public Walze(String hersteller) {
this.durchmesser = 210.0; // Standardwert
this.hersteller = hersteller;
}
Walze arbeitswalze = new Walze(210.0, „SMS Siemag AG");
}
Walze arbeitswalze
= new Walze(„SMS Siemag AG");
Informatik 2
12
FH D
Verkettung von Konstruktoren
Fachhochschule Düsseldorf
University of Applied Sciences
 Wenn in überladenen Konstruktoren die selben aufwendige Berechnungen
erfolgen, kann es sinnvoll sein die Konstruktoren zu verketten.
 Verkettung von Konstruktoren: Die Konstruktoren rufen sich gegenseitig auf.
 Ein Konstruktor kann den anderen Konstruktor mit this aufrufen.
 Der Aufruf des anderen Konstruktors muss der erste Befehl der Methode sein!
public class Walze {
double durchmesser;
String hersteller;
public Walze(double durchmesser,
String hersteller) {
this(hersteller);
this.durchmesser = durchmesser;
}
Erst den
anderen
Konstruktor
aufrufen!
public Walze(String hersteller) {
this.durchmesser = 210.0; // Standardwert
this.hersteller = hersteller;
}
}
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Default-Konstruktor
 Wenn kein expliziter (selbst definierter) Konstruktor definiert wurde, dann
verwendet Java den Default-Konstruktor.
 Der Default-Konstruktor hat keine Übergabeparameter.
 Anfangsbeispiel: Walze arbeitswalze = new Walze();
 Wenn explizite Konstruktoren definiert sind, dann existiert kein DefaultKonstruktor mehr!!!
 Das Anfangsbeispiel erzeugt nun einen Compiler-Fehler.
 Falls immer noch ein Konstruktor ohne Übergabeparameter gewünscht ist,
muss dieser erst wieder definiert werden!
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Zusammenfassung Konstruktoren
 Mit Konstruktoren werden Instanzvariablen initialisiert und Berechnungen
durchgeführt, welche für das Objekt von Beginn an wichtig sind.
 Ein Konstruktor hat denselben Namen wie seine Klasse.
 Ein Konstruktor hat keinen Rückgabeparameter – auch nicht void.
 Ein Konstruktor kann, wie andere Methoden, Parameter besitzen oder ohne
Parameterliste definiert werden.
 Eine Klasse kann mehrere Konstruktoren besitzen.
 Konstruktoren müssen sich in ihrer Parameterliste von einander unterscheiden
(Anzahl der Parameter, Reihenfolge der Datentypen).
 Ohne expliziten Konstruktor hat jede Klasse einen parameterlosen DefaultKonstruktor.
 Sobald man einen expliziten Konstruktor definiert hat, gibt es keinen DefaultKonstruktor mehr.
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiele zu primitiven Datentypen
DezimalZahlen
Ganze Zahlen
 Wiederholung:
 Primitive Datentypen sind in Java fest eingebaut (blau in NetBeans)
 int a = 12;
 Primitive Datentypen sind keine Klassen!
Typ
Bemerkung
boolean „Wahr“, „Flasch“
char
Nur ein Zeichen
byte
short
int
L oder l muss
long
Suffix sein
F oder f muss
float
Suffix sein
double
Beispiel
boolean istBehälterVoll = true;
char zeichen = 'a';
byte a = 126;
short b = 1900;
int c = -190000;
long = +190000L;
float e = 3.14F;
double f = 6.D;
Informatik 2
2
FH D
Implizite Typkonvertierung
Fachhochschule Düsseldorf
University of Applied Sciences
 In Java können die primitiven Datentypen konvertiert werden, weil etwa ein
Double -Wert in eine Integer-Variable geschrieben werden soll.
 Java kann einige Typkonvertierungen implizit (automatisch) vornehmen.
 Bei der impliziten Typkonvertierung ist die Pfeilrichtung zu beachten.
Ganze Zahlen
byte
short
Dezimal-Zahlen
int
long
char
boolen
float
double
Geht nicht…
 Regel für implizite Typkonvertierung:
 Präzision geht nicht verloren (daher automatisch möglich)
 Umwandlung in Datentyp mit mehr Speicherplatzverbrauch
 Ausnahmen:
 char (2 Byte) in int (4 Byte)
 boolean geht gar nicht
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiele: Implizite Typkonvertierung
 Bei den Beispielen ist die Richtung der Zuweisung zu beachten!
 Dabei können auch Datentypen „übersprungen“ werden.
 Beispiel: int direkt in double
Definition
char zeichen = 'a';
byte a = 126;
short b = 1900;
int c = -190000;
float e = 3.14F;
Nachfolgende Zuweisung
zeichen = a;
a = zeichen;
b = a;
b = zeichen;
c = a;
c = zeichen;
a = c;
e = b;
b = e;
e = 10L;
Informatik 2
Bemerkung
byte  char geht nicht!
char  byte geht nicht!
byte  short funktioniert.
char  short geht nicht!
byte  int funktioniert.
char  int funktioniert.
int  byte geht nicht!
short  float funktioniert.
float  short geht nicht!
long  float funktioniert.
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Explizite Typkonvertierung
 In Java (auch in C) können Datentypen explizit konvertiert werden.
 Explizite Typkonvertierung: Erzwungen, meist unter Verlust der Präzision.
 Die explizite Datenkonvertierung erfolgt durch die Angabe des Datentyps in
vorangestellten Klammern: (Datentyp) Variable
 Beispiel: double a = 4711.0815;  int b = (int) a;
 Ergebnis: Der Variablen b wird der Wert 4711 zugewiesen.
 Konsequenz: Weil die Nachkommastellen abgeschnitten werden,
wird die Präzision nicht erhalten!
 Wichtig: Explizite Typkonvertierung = Informationsverlust!
 Beispiel: byte a = (byte) 4711.0815; Ergebnis: a = 103
 Beispiel: Zuweisung
 float c = 4711.0815;
 Was ist falsch? Drei Lösungen ohne Informationsverlust!
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse: String
 Der Datentyp String ist kein primitiver Datentyp, sondern eine Klasse.
 Sonderstellung, weil kein new-Operator zwingend erforderlich
 Geht aber auch: String a = new String(“Informatik“);
 Die Zeichenketten sind einzelne Zeichen des primitiven Datentyps char.
 Die String-Klasse stellt mehrere Methoden zu Verfügung.
 Beispiele (Erstes Zeichen = Position 0):
 Suchen in Zeichenkette: int b = a.indexOf("at");  b = 6
 Zeichen an Position: char c = a.charAt(2);  c = ‘f‘;
 Vergleich von Zeichenketten: int d = a.compareTo("Informatik1"); d = -1
 -1: Zeichenketten nicht gleich
 0:
Zeichenketten gleich
Informatik 2
6
FH D
Wrapper-Klassen
Fachhochschule Düsseldorf
University of Applied Sciences
 Für die primitiven Datentypen werden Klassen zu Verfügung gestellt, welche
nützliche Methoden für die Datentypen enthalten.
 Die Klassen nennt man Wrapper-Klassen
Datentyp Wrapper
 Wrapper (engl.) = Hülle
boolen
Boolean
 Diese Klassen umhüllen den primitiven Datentyp.
char
Character
 Die meisten Methoden sind statisch (static) definiert,
byte
Byte
können also ohne Objekt direkt mit dem Klassennamen
short
Short
verwendet werden.
 Häufige Verwendung: Typkonvertierung
 Beispiel Umwandlung String  int
 So geht es nicht:
String anzSchraubenStr = "42";
int anzSchrauben = (int) anzSchraubenStr;
Informatik 2
int
long
float
double
Integer
Long
Float
Double
 Falsch!
7
FH D
Typumwandlung mit Wrapper-Klassen
Fachhochschule Düsseldorf
University of Applied Sciences
 Beispiel Umwandlung String  int
String anzSchraubenStr = "42";
int anzSchrauben;
1. Umwandlung mit Konstruktor der Integer-Klasse:
 Integer-Klasse hat Konstruktor mit String als Übergabeparameter
 Integer-Objekte haben .intValue() Methode für Umwandlung in int.
Integer tmp = new Integer(anzSchraubenStr);
anzSchrauben = tmp.intValue();
 In einer Zeile:
anzSchrauben = new Integer(anzSchraubenStr).intValue();
2. Umwandlung mit statischer Methode:
 Integer-Klasse hat statische Methode .valueOf(<String>)
anzSchrauben = Integer.valueOf(anzSchraubenStr).intValue();
Informatik 2
8
FH D
Operatoren
Fachhochschule Düsseldorf
University of Applied Sciences
 Ein Ausdruck besteht immer aus mindestens einem Operator und einem oder
mehreren Operanden, auf die der Operator angewendet wird.
 Stelligkeit des Operators:
 Operatoren, die lediglich ein Argument erwarten, nennt man einstellig,
solche mit zwei Argumenten zweistellig
 Einstellig: Vorzeichen (unärer Operator)
 Zweistellig: Addition, Multiplikation, etc.
 Dreistellig: Fragezeichenoperator
 Typ des Operators:
 numerische, relationale, logische, bitweise, Zuweisungs- und sonstige
Operatoren
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Operator
Arithmetische Operatoren
Bezeichnung
Bedeutung
+
Positives Vorzeichen
+n ist gleichbedeutend mit n.
-
Negatives Vorzeichen -n kehrt das Vorzeichen von n um.
+
Summe
a + b ergibt die Summe von a und b.
-
Differenz
a - b ergibt die Differenz von a und b.
*
Produkt
a * b ergibt das Produkt aus a und b.
/
Quotient
a / b ergibt den Quotienten von a und b. Bei integralen Typen
handelt es sich hierbei um die ganzzahlige Division ohne Rest.
%
Restwert
a % b ergibt den Rest der ganzzahligen Division von a durch b.
++
Präinkrement
++a ergibt a+1 und erhöht a um 1.
++
Postinkrement
a++ ergibt a und erhöht a um 1.
--
Prädekrement
--a ergibt a-1 und verringert a um 1.
--
Postdekrement
a-- ergibt a und verringert a um 1.
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Relationale Operatoren
 Die relationalen Operatoren arbeiten auf beliebigen - auch gemischten numerischen Typen.
 Im Fall von Gleichheit und Ungleichheit funktionieren sie auch auf Objekttypen,
beziehen sich dann jedoch nicht auf den Inhalt, sondern die Adressen  später
Operator
Bezeichnung
Bedeutung
==
Gleich
!=
Ungleich
<
Kleiner
a == b ergibt true, wenn a gleich b ist. Sind a und b
Referenztypen, so ist der Rückgabewert true, wenn beide Werte
auf dasselbe Objekt zeigen.
a != b ergibt true, wenn a ungleich b ist. Sind a und b Objekte, so
ist der Rückgabewert true, wenn beide Werte auf
unterschiedliche Objekte zeigen.
a < b ergibt true, wenn a kleiner b ist.
<=
Kleiner gleich
a <= b ergibt true, wenn a kleiner oder gleich b ist.
>
Größer
a > b ergibt true, wenn a größer b ist.
>=
Größer gleich
a >= b ergibt true, wenn a größer oder gleich b ist.
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Logische Operatoren
 Logische Operatoren dienen dazu, boolesche Werte miteinander zu verknüpfen.
Operator
Bezeichnung
Bedeutung
!
Logisches NICHT
!a ergibt false, wenn a wahr ist, und true, wenn a falsch ist.
&&
UND mit ShortCircuit-Evaluation
||
ODER mit ShortCircuit-Evaluation
&
UND ohne ShortCircuit-Evaluation
ODER ohne ShortCircuit-Evaluation
Exklusiv-ODER
a && b ergibt true, wenn sowohl a als auch b wahr sind.
Ist a bereits falsch, so wird false zurückgegeben und b nicht
mehr ausgewertet.
a || b ergibt true, wenn mindestens einer der beiden Ausdrücke
a oder b wahr ist.
Ist bereits a wahr, so wird true zurückgegeben und b nicht mehr
ausgewertet.
a & b ergibt true, wenn sowohl a als auch b wahr sind. Beide
Teilausdrücke werden ausgewertet.
a | b ergibt true, wenn mindestens einer der beiden Ausdrücke a
oder b wahr ist. Beide Teilausdrücke werden ausgewertet.
a ^ b ergibt true, wenn beide Ausdrücke einen unterschiedlichen
Wahrheitswert haben.
|
^
Informatik 2
12
FH D
Zuweisungsoperatoren
Fachhochschule Düsseldorf
University of Applied Sciences
 Eine Zuweisung gilt nicht als Anweisung, sondern als Ausdruck, der einen
Rückgabewert erzeugt.
Operator
Bezeichnung
=
Einfache Zuweisung
+=
Additionszuweisung
-=
Subtraktionszuweisung
*=
/=
%=
Bedeutung
a = b weist a den Wert von b zu und liefert b als
Rückgabewert.
a += b weist a den Wert von a + b zu und liefert a + b als
Rückgabewert.
a -= b weist a den Wert von a - b zu und liefert a - b als
Rückgabewert.
Multiplikationszuweisung a *= b weist a den Wert von a * b zu und liefert a * b als
Rückgabewert.
Divisionszuweisung
a /= b weist a den Wert von a / b zu und liefert a / b als
Rückgabewert.
Modulozuweisung
a %= b weist a den Wert von a % b zu und liefert a % b als
Rückgabewert.
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Sonstige Operatoren
 Fragezeichenoperator (wie in C)
 a ? b : c ist also b, falls a wahr ist, und c, falls a falsch ist.
 Cast-Operator
 Explizite Typumwandlung mit Datentyp in Klammern
 String-Verkettung mit „+“
int anzSchrauben = 42;
System.out.println(„Anzahl der Schrauben = " + anzSchrauben );
 Achtung: Klammern bei Berechnungen!
 Ergebnis 425:
int anzSchrauben = 42;
System.out.println(„Anzahl der Schrauben = " + anzSchrauben + 5);
 Ergebnis 47:
int anzSchrauben = 42;
System.out.println(„Anzahl der Schrauben = " + (anzSchrauben+5));
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Blöcke
Fachhochschule Düsseldorf
University of Applied Sciences
 Blöcke erweitern einzelne Anweisungen, etwa bei Kontrollstrukturen  später
 Beispiel:
 Einzelne Anweisung:
 anweisung;
 Erweiterung der einzelnen Anweisung:
 {
anweisung1;
anweisung2;
…
}
 Blöcke können geschachtelt werden.
 Wichtig:
 Variablen sind nur innerhalb des Blocks und in den Verschachtelungsebenen
sichtbar!
 Wenn der Block geschlossen wird, ist die Variable weg!
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: Variablen in Blöcken
 In diesem Beispiel
 Die Variablen sind nur innerhalb des Blocks sichtbar.
 Nach dem Block können die Variablen mit gleichem Namen wieder anders
definiert werden.
public static void main(String[] args) {
{ int a = 15;
{
int b = 16;
System.out.println("Zahl:" + (b + a));
}
System.out.println("Zahl:" + a);
}
{ double a = 17.0;
System.out.println("Zahl:" + a);
}
System.out.println("Zahl:" + a);
}
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Bedingte Verzweigung
 Wenn Teile eines Programms nur unter bestimmten Bedingungen ausgeführt
werden sollen, werden Verzeigungen verwendet.
 Die Bedingungen können sich zur Laufzeit ändern.
 In Java gibt es zwei verschiedene Anweisungen für Verzweigungen
 if-Anweisung
 switch-Anweisung
if (logischer Ausdruck)
Anweisung;
if (logischer Ausdruck)
Anweisung;
else
Anweisung;
switch (Ausdruck) {
case Konstante1:
Anweisung1;
case Konstante2:
Anweisung2;
…
default:
StandardAnweisung;
}
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
If-Anweisung
 Wichtig: Der logische Ausdruck hinter if muss vom Typ boolean (true/false)
sein! Es ist nicht möglich dort Zahlen einzusetzen (wie in C oder MATLAB)
 random() erzeugt eine gleichverteile Zufallszahl (double) zwischen 0…1
 Beispiel: Münzwurf
double zufallZahl = java.lang.Math.random();
String strKopfZahl;
if (zufallZahl > 0.5)
strKopfZahl = "Kopf";
else
strKopfZahl = "Zahl";
System.out.println("Die Münze zeigt " + strKopfZahl);
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
If-Anweisung: Gleichheit
 Wichtig: Auf Gleichheit wird mit zwei Gleichheitszeichen getestet!
 Beispiel: Würfel mit Anzeige, ob Pasch gewürfelt wurde
 Achtung: Beachten Sie die Vorgehensweise bei den ganzen Zufallszahlen
int würfel_a = (int) (java.lang.Math.random()*6) + 1;
int würfel_b = (int) (java.lang.Math.random()*6) + 1;
String Meldung = "Die Würfel zeigen ";
if (würfel_a == würfel_b)
Meldung += würfel_a + "er Pasch";
else
Meldung += würfel_a + " und " + würfel_b;
System.out.println(Meldung);
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
If-Anweisung: Gleichheit von Fließkommazahlen
 Wichtig: Vermeiden Sie es Fließkommazahlen auf Gleichheit zu testen!
 Gerade im Ingenieurbereich kann es zu schwerwiegenden Fehlern kommen!
 Beispiel:
1 
b=  ⋅ a  − 1 + a
a 
b = 1−1+ a
b=a
double a = 0.42;
double b = ((1/a) * a) - 1.0 + a ;
if (b == a)
System.out.println("a gleich b");
else
System.out.println("a ungleich b");
 Mit Zahlen:
 a=0,42  a gleich b
 a=0,41  a ungleich b
 Besser:
 Unterschreiten von
Schwellwert.
final double EPSILON = 1e-10;
if (Math.abs(a-b)<EPSILON)
System.out.println("a gleich b");
Informatik 2
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
If-Anweisung: „Dangling else“
 Verschachtelte If-Anweisung können bei ungeeigneter Formatierung vom
Menschen falsch interpretiert werden.
 Das else wird immer der inneren if-Anweisung zugeordnet!
c = 0;
if (a == 1)
if (b == 1)
c = 1;
else
c = 2;
c = 0;
if (a == 1)
if (b == 1)
c = 1;
else
c = 2;
c = 0;
if (a == 1) {
if (b == 1)
c = 1;
}
else
c = 2;
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Bezeichnung
Es gibt keine if-Schleife
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Switch-Anweisung
 Mehrfachverzeigungen können mit der switch-Anweisung verständlicher
implementiert werden, als mit geschachtelten if-Abfragen.
 Ausdruck muss vom Typ byte,
short, int oder char sein!
 Die Konstante und der Ausdruck
müssen zuweisungskompatibel sein.
 Konstanten dürfen nicht doppelt
vorkommen.
 Das default-Label ist optional und
wird angesprungen, wenn keine
Konstante zutrifft.
switch (Ausdruck) {
case Konstante1:
Anweisung1;
case Konstante2:
Anweisung2;
…
default:
StandardAnweisung;
}
 Die Anweisungen werden alle ab der zutreffenden Konstanten ausgeführt!
 Soll dies nicht geschehen, muss die Anweisung am Ende mit break beendet
werden.
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
 Ausgabe:
 Zwei
Null?
Beispiel: Switch-Anweisung
int a = 2;
switch (a) {
case 1:
System.out.println("Eins");
case 2:
System.out.println("Zwei");
default:
System.out.println("Null?");
}
int a = 2;
switch (a) {
case 1:
System.out.println("Eins");
break;
case 2:
System.out.println("Zwei");
break;
default:
System.out.println("Null?");
break;
}
Informatik 2
 Ausgabe:
 Zwei
11
FH D
Schleifen
Fachhochschule Düsseldorf
University of Applied Sciences
 while-Schleife:
 Die Schleife wird durchlaufen,
solang der logische Ausdruck wahr
ist.
 Wenn der logische Ausdruck zu
Anfang schon falsch ist, wird die
Anweisung gar nicht ausgeführt!
 do-Schleife:
 Die Schleife wird beendet, wenn
der logische Ausdruck falsch ist.
 Die Anweisung wird mindestens
einmal durchlaufen, weil der
logische Ausdruck erst am Ende
geprüft wird!
Informatik 2
while (logischer Ausdruck)
Anweisung;
do
Anweisung;
while (logischer Ausdruck)
12
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
for-Schleifen
for (init; test; update)
Anweisung;
 Der Kopf der for-Schleife besteht aus drei Ausdrücken, die jeder für sich
optional sind:
 Der init-Ausdruck wird einmal vor dem Start der Schleife aufgerufen. Er dient
dazu, Initialisierungen durchzuführen.
 Der init-Teil darf auch aus mehreren Ausdrücken bestehen, wenn die einzelnen
Teilausdrücke durch Kommata getrennt sind.
 Fehlt der Initialisierungsteil, wird keine Initialisierung im Kopf der Schleife
durchgeführt.
 Der init-Teil darf auch Variablendeklarationen enthalten, beispielsweise, um
einen Schleifenzähler zu erzeugen.
 Der test-Teil bildet den Testausdruck der Schleife. Analog zur while-Schleife
wird er am Anfang der Schleife ausgeführt.
 Der update-Ausdruck dient dazu, den Schleifenzähler zu verändern.
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: for-Schleifen
for (int i=1; i<=3; i++) {
System.out.println("i ist " + i);
}
int i = 1;
for (; i<=3; i++) {
System.out.println("i ist " + i);
}
int i = 1;
for (; i<=3;) {
System.out.println("i ist " + i++);
}
Informatik 2
14
FH D
Übung
Fachhochschule Düsseldorf
University of Applied Sciences
 Schreiben Sie eine berechneGLS_Versandkosten()-Methode für die
Klasse GLS_Paket, welche die Versandkosten in Euro zurückgibt. Auf der
Internetseite von GLS findet sich folgende Anleitung für die Berechnung der
Versandkosten.
 „Die Größe Ihres Pakets (längste Seite + kürzeste Seite) wird in Ihrem
Paketshop mit einem Maßband vermessen. Je nach Größe ergeben sich nur
noch fünf verschiedene Preisklassen – XS bis XL – unabhängig vom Gewicht.“
 „Das Gurtmaß (Umfang des Paketes zzgl. längste Seite) darf 3 m nicht
überschreiten.“
Pack-Größe Längste + kürzeste Seite Versandkosten
 Wenn das maximale
XS
max. 35 cm
4,10 €
Gurtmaß überschritten
S
max. 50 cm
5,90 €
wird, soll die
M
max. 65 cm
6,90 €
Methode -1.0
L
max. 80 cm
9,90 €
zurückgeben.
XL
max. Gurtmaß
15,30 €
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vorbereitung
 Gegeben ist:
 a = kürzeste Seite
 b = zweitkürzeste Seite
 c = längste Seite
c
 Wichtige Berechnungen:
 a+c
= längste + kürzeste Seite
a  2*(a+b)+c = Gurtmaß
b
 Rückgabetyp: float oder double, weil die Versandkosten
Nachkommastellen haben.
 Also:
 public float berechneGLS_Versandkosten()
Informatik 2
16
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Verzweigung wie in Tabelle
1. if (a+c <= 35)
2.
return 4.1f;
3. if (a+c <= 50)
4.
return 5.9f;
5. if (a+c <= 65)
6.
return 6.9f;
7. if (a+c <= 80)
8.
return 9.9f;
Pack-
Längste + kürzeste Versand-
Größe
XS
S
M
L
XL
Seite
max. 35 cm
max. 50 cm
max. 65 cm
max. 80 cm
max. Gurtmaß
kosten
4,10 €
5,90 €
6,90 €
9,90 €
15,30 €
9. if ((2*(a+b)+c) <= 300)
10.
return 15.3f;
11. return -1f; // unzulässige Paketgröße
Informatik 2
17
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Referenzen
Fachhochschule Düsseldorf
University of Applied Sciences
 Beispiel an der einfachen Klasse Walze:
public class Walze {
int id;
public Walze(int id) {
this.id = id;
}
}
 Verwenden der Klasse Walze in zwei Variablen:
Walze a = new Walze(1);
Walze b = new Walze(2);
System.out.println(“Walze a = " + a.id);
System.out.println(“Walze b = " + b.id);
 Ausgabe ????
 a=1
 b=2
Informatik 2
2
FH D
Referenzen
Fachhochschule Düsseldorf
University of Applied Sciences
 Das erzeugen von Referenzen geschieht über das Schlüsselwort new.
 Referenzen von Objekten sind als Adresse im Hauptspeicher zu verstehen, wo
das Objekt zu finden ist.
obj[0]
obj[1]
obj[2]
…
Ref_obj
 Werden an diesem Objekt Änderungen durchgeführt, dann hat dies auch
Auswirkungen auf das Original.
 Für das Kopieren von Attributen (deep copy), und nicht von Referenzen
(shallow copy), benötigt man also einen Kopiermechanismus.
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Shallow Copy: Kopieren von Objekten (= Referenzen)
 Änderung des Programms: Objekt kopieren
 Ausgabe ????
Walze a = new Walze(1);
Walze b = a; // kopieren...
System.out.println(“Walze a = " + a.id);
System.out.println(“Walze b = " + b.id);
 a=1
 b=1
 Änderung von a nach b kopieren. Danach sollte b unverändert bleiben…
 Ausgabe ????
Walze a = new Walze(1);
Walze b = a; // kopieren...
b.id = 2;
System.out.println(“Walze a = " + a.id);
System.out.println(“Walze b = " + b.id);
 a=2
 b=2
 Es werden die Referenzen kopiert, nicht der Inhalt!
 Danach zeigen a und b auf die selbe Stelle im Hauptspeicher!
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Value Types vs. Reference Types
 Bei primitiven Datentypen (value types) wird
 bei Übergabe- / Rückgabedatentyp in Methoden der Inhalt kopiert (Call By
Value).
 bei Zuweisung der Inhalt kopiert.
 Bei Objekten (reference types) wird
 bei Übergabe- / Rückgabedatentyp in Methoden die Referenz übergeben (Call
By Value). Achtung: nicht wie in C++ oder C# (Call By Reference)!
 bei Zuweisung die Referenz kopiert, nicht der Inhalt.
Walze a = new Walze(1);
Walze b = a; // Referenz kopieren...
a.id = 2;
System.out.println(“Walze a = " + a.id); // Ausgabe 2
System.out.println(“Walze b = " + b.id); // Ausgabe 2
int c = 1;
int d = c; // Inhalt kopieren
c = 2;
System.out.println("c = " + c); // Ausgabe 2
System.out.println("d = " + d); // Ausgabe 1
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Parameterübergabe By-Value
public void copyTo(Walze target, double durchmesser){
durchmesser = 4;
target.durchmesser = this.durchmesser;
target.hersteller = this.hersteller;
target.maxbandgeschwindigkeit =
this.maxbandgeschwindigkeit;
target.umlaufgeschwindigkeit = this.umlaufgeschwindigkeit;
}
public static void main(String[] args)
{
Walze arbeitswalze1 = new Walze("SMS", 200.0, 10.0);
Walze arbeitswalze3 = new Walze("Siemens VAI", 300.0, 10.0);
arbeitswalze1.zeigeInfo();
arbeitswalze3.zeigeInfo();
double durchmesser = 300.0;
arbeitswalze1.copyTo(arbeitswalze3, durchmesser);
arbeitswalze3.zeigeInfo();
System.out.println("durchmesser = "+durchmesser);
}
Ausgabe ????
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Deep Clone/Copy
public Walze deepcopy() {
return new Walze( this.hersteller, this.durchmesser,
this.umlaufgeschwindigkeit);
}
public static void main(String[] args)
{
Walze arbeitswalze1 = new Walze("SMS", 200.0, 10.0);
Walze arbeitswalze2 = new Walze("Danieli", 250.0, 10.0);
Walze arbeitswalze5 = arbeitswalze2.deepcopy();
arbeitswalze5.zeigeInfo();
arbeitswalze5 = arbeitswalze1.deepcopy();
arbeitswalze5.zeigeInfo();
}
Was passiert jetzt mit dem belegten Speicher von der alten Referenz in arbeitswalze5 ?
Informatik 2
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Garbage-Collector (GC)
Der Garbage-Collector
 überwacht alle erzeugten Referenzen,
 löscht nicht mehr benötigte Referenzen vom Heap
 ruft vor dem löschen auf dem Heap die finalize()-Methode auf
 stoppt alle Threads während des Aufräumens
 defragmentiert von Zeit zu Zeit den Heap.
Am Rande: Der GC von der JVM von Sun ist ein sogenannter Generational GC.
Informatik 2
8
FH D
Spezielle Referenzen
Fachhochschule Düsseldorf
University of Applied Sciences
 null-Referenz: Referenz die sich auf ein nicht-existierendes Objekt bezieht.
 Ermöglicht uninitialisierte Referenzvariablen zu definieren.
 null besitzt keine Methoden oder Attribute.
 Dient zum kennzeichnen/markieren von Enden in Speicherstrukturen.
 Zuweisen von null einer Referenzvariablen erzwingt Löschung durch GC.
 this-Referenz: Referenz auf das Objekt selbst.
 Wird verwendet zur Unterscheidung von Attributen und Variablen.
public class Walze {
int id;
public Walze(int id) {
this.id = id;
}
}
 super-Referenz: Referenz auf das Objekt der Superklasse (->später).
 Wird analog wie this zum Zugriff auf die Superklassen-Methoden/Attribute
verwendet.
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Identität/Gleichheit von Objekten
 Vergleichsoperator == testet die Identität von Referenzen. D.h. true =>
Referenzvariablen zeigen auf gleiches Objekt, andernfalls false.
 Für Test auf Gleichheit muss erst definiert werden, was Gleichheit zwischen
zwei Instanzen bzw. Objekten bedeutet!
 Implementierung durch Methode boolean equals(Object obj):
public class Walze {
int id;
instanceof
testet den Typ
der Instanz.
public Walze(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj){
if (obj instanceof Walze)
return ((Walze)obj).id == this.id;
super.equals(obj);
}
}
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel Reference Type: Arrays - Datenfelder
 Die wichtigsten Eigenschaften von Arrays zusammengefasst:
 Arrays dienen zum Speichern von mehreren Daten (1…n) des selben festen
Datentyps.
 In Arrays können primitive Datentypen und Referenz-Datentypen
gespeichert werden.
 Arrays
 sind Objekte
 sind Referenzen
 besitzen sowohl Methoden, als auch Instanz-Variablen
 werden zur Laufzeit erzeugt
 Arrays sind semi-dynamisch:
 Die Größe kann zur Laufzeit mit einer Variablen festgelegt werden.
 Danach ist die Größe nicht mehr änderbar.
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Erzeugen von Arrays
 Die Erzeugung eines Arrays erfolgt in zwei Schritten
 Deklaration einer Array-Variablen
 Erzeugen eines Arrays und Zuweisung an die Array-Variable
 Beispiel Deklaration
oder [] hinter Variable (wie bei C)
int[] matrikelnummern;
double[] messwerte;
int matrikelnummern[];
double messwerte[];
 Erzeugen der Arrays
matrikelnummern = new int[5];
int n = 6;
messwerte = new double[n];
 Wichtig:
 Die Nummerierung beginnt nicht bei 1, sondern bei 0.
 Beispiel: messwerte[n] ist falsch, weil das Array nur von [0…n-1] geht!
Informatik 2
12
FH D
Erzeugen und Füllen von Arrays
Fachhochschule Düsseldorf
University of Applied Sciences
 Die Deklaration und Erzeugung von Arrays kann auch in einem Schritt erfolgen:
double[] messwerte = new double[5];
 Füllen von Arrays
 Lesend und schreibend kann auf die Elemente der Arrays zugegriffen
werden, indem der Index in Eckigen klammern angegeben wird.
 Der Index kann auch eine Variable sein.
messwerte[0]
messwerte[1]
messwerte[2]
messwerte[3]
messwerte[4]
=
=
=
=
=
12.4;
10.3;
13.1;
9.8;
8.7;
 Deklaration, Erzeugung und Füllen in einem Schritt:
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Länge eines Array/Klonen von Arrays
 Mit dem Attribut length des Arrays kann die Anzahl der Elemente abgefragt
werden. Zuweisen geht allerdings nicht (weil final -> später!).
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
messwerte.length = 7; // Versuch: Array vergrößern...
 Fehlermeldung:
 Uncompilable source code - cannot assign a value to final variable length
 Mit der Methode clone() lassen sich einfach Arrays mit identischer Größe und
Inhalt erzeugen:
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
double[] sicherung = messwerte.clone();
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Mit Schleifen durch Arrays
 Dieses Beispiel gibt die Nummer des Messwertes und den Messwert aus.
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
for (int i =0; i < messwerte.length; i++)
System.out.println("Messwert Nr." + (i+1) + " = " + messwerte[i]);
 Beispiel: Wenn ein Messwert unter einem Schwellwert liegt, dann ersetzen
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
for (int i =0; i < messwerte.length; i++) {
if (messwerte[i] <= schwellwert)
messwerte[i] = schwellwert;
System.out.println("Messwert = " + messwerte[i]);
}
 Alternative:
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
for (double wert : messwerte)
System.out.println("Messwert = " + wert);
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Feld sortieren mit Java
 Methode java.util.Arrays.sort verwenden:
double[] messwerte = new double[] {12.4, 10.3, 13.1, 9.8, 8.7};
java.util.Arrays.sort(messwerte);
System.out.println("\nSortiert:");
for (double sample : messwerte)
System.out.println("Messwert = " + sample);
 Ausgabe:
 Sortiert:
 Messwert = 8.7
 Messwert = 9.8
 Messwert = 10.3
 Messwert = 12.4
 Messwert = 13.1
Informatik 2
16
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Arrays an Methoden übergeben
 Arrays sind Objekte daher Referenzen:
public void sortiereInhalt(double[] feld){
java.util.Arrays.sort(feld);
}
public void sortiereInhalt(double[] feld){
double[] neuesfeld = feld.clone();
java.util.Arrays.sort(neuesfeld);
feld = neuesfeld;
}
Informatik 2
17
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Vererbung
Fachhochschule Düsseldorf
University of Applied Sciences
 Eines der wesentlichen Designmerkmale objektorientierter Sprachen ist die
Möglichkeit, Variablen und Methoden zu Klassen zusammenzufassen.
 Ein weiteres wichtiges Merkmal ist das der Vererbung, also der Möglichkeit,
Eigenschaften vorhandener Klassen auf neue Klassen zu übertragen.
 Fehlt diese Fähigkeit, bezeichnet man die Sprache auch als lediglich
objektbasiert.
 Man unterscheidet bei objektorientierten Sprachen zwischen
 Einfachvererbung, bei der eine Klasse von maximal einer anderen Klasse
abgeleitet werden kann
 Mehrfachvererbung, bei der eine Klasse von mehr als einer anderen Klasse
abgeleitet werden kann.
 In Java gibt es ohne Beschränkung der Allgemeinheit nur Einfachvererbung!
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: Vererbung
 Um eine neue Klasse aus einer
bestehenden abzuleiten, ist im Kopf
der Klasse mit Hilfe des
Schlüsselworts extends ein Verweis
auf die Basisklasse anzugeben.
 Durch Hinzufügen neuer Elemente
oder Überladen der vorhandenen
kann die Funktionalität der
abgeleiteten Klasse erweitert werden.
class A{
public int attrA;
public A(){
attrA = 1;
}
}
class B extends A{
public int attrB;
public B(){
attrB = 2;
}
}
 Klasse A ist Mutterklasse (Superklasse) von Klasse B.
 Klasse B ist Tochterklasse (Subklasse) von Klasse A.
 Klasse B erbt alle öffentlichen Methoden und Eigenschaften von B.
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vererbung von Konstruktoren
 Wenn eine Klasse instanziert wird, garantiert Java, dass ein zur
Parametrisierung des new-Operators passender Konstruktor aufgerufen wird.
 Daneben garantiert der Compiler, dass auch der Konstruktor der Mutterklasse
aufgerufen wird. Dieser Aufruf kann entweder explizit oder implizit geschehen:
 Falls als erste Anweisung innerhalb eines Konstruktors ein Aufruf der
Methode super steht, wird dies als Aufruf des Superklassenkonstruktors
interpretiert.
 Falls als erste Anweisung im Konstruktor kein Aufruf von super steht, setzt
der Compiler an dieser Stelle einen impliziten Aufruf super() ein und ruft
damit den parameterlosen Konstruktor der Mutterklasse auf.
 Falls ein parameterloser Konstruktor in der Mutterklasse nicht definiert
wurde, gibt es einen Compiler-Fehler.
 Das ist genau dann der Fall, wenn in der Superklassendeklaration lediglich
parametrisierte Konstruktoren angegeben sind.
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: Vererbung von Konstruktoren
class A{
public int attrA;
public A(int attrA){
this.attrA = attrA;
}
}
 Klasse B erbt das Attribut von Klasse A.
class B extends A{
public int attrB;
public B(int attrB){
super(attrA);
this.attrB = attrB;
}
}
 Bei Instanzierung von B muss der
Konstruktor von A explizit aufgerufen
werden.
Informatik 2
 Die Klasse B wird um ein Attribut
erweitert.
 Das neue Attribut von B wird
initialisiert.
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Überlagerte Methoden (overridden methods)
 Wird eine Methode x in einer abgeleiteten Klasse überlagert, wird die
ursprüngliche Methode x verdeckt.
 Aufrufe von x beziehen sich immer auf die überlagernde Variante.
 Oftmals ist es allerdings nützlich, die verdeckte Superklassenmethode aufrufen
zu können, beispielsweise, wenn deren Funktionalität nur leicht verändert
werden soll.
 In diesem Fall kann mit Hilfe des Ausdrucks super.x() die Methode der
Mutterklasse aufgerufen werden.
 Der kaskadierte Aufruf von Superklassenmethoden, etwa
super.super.x(), ist nicht erlaubt.
 Später mehr zum Thema Polymorphie und Typcasting von Referenzen!
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: Methode überlagern
class A{
public int attrA;
public A(int attrA){
this.attrA = attrA;
}
public void zeige(){
System.out.println(“A=“,attrA);
}
}
class B extends A{
public int attrB;
public B(int attrB){
super(attrA);
this.attrB = attrB;
}
public void zeige(){
super.zeige();
System.out.println(“B=“,attrB);
}
}
Informatik 2
 Methode zeige() wird
in Superklasse und
Subklasse definiert!
 zeige() der Superklasse
kann über superReferenz aufgerufen
werden.
 Methoden überlagern
ist nicht mit Methoden
überladen zu
verwechseln!!!
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse Object: Mutter aller Klassen in der JavaKlassenhierarchie
 Enthält eine Klassendefinition kein extends, so besitzt sie trotzdem die
implizite Mutterklasse Object.
 Jede Klasse, die keine extends-Klausel besitzt, wird direkt aus Object
abgeleitet.
 Jede explizit abgeleitete Klasse stammt am oberen Ende ihrer Vererbungslinie
von einer Klasse ohne explizite Superklasse ab und ist damit ebenfalls aus
Object abgeleitet.
 Object ist also die Superklasse aller anderen Klassen!
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Geerbt von der Object-Klasse
 Die Klasse Object definiert einige elementare Methoden, die für alle Arten von
Objekten nützlich sind:
 Damit diese Methoden in abgeleiteten Klassen vernünftig funktionieren,
müssen sie bei Bedarf überlagert werden.
 Für equals und clone gilt das insbesondere, wenn das Objekt Referenzen
enthält.
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifikatoren
 Die Sichtbarkeit von Variablen und Methoden wird mit Hilfe folgender
Modifikatoren (Modifier) geregelt:
 public
 Elemente sind in der Klasse selbst (also in ihren Methoden), in Methoden
abgeleiteter Klassen und für den Aufrufer von Instanzen der Klasse sichtbar.
 protected
 Elemente sind in der Klasse selbst und in Methoden abgeleiteter Klassen
sichtbar. Zusätzlich können Klassen desselben Pakets sie aufrufen.
 private
 Elemente sind lediglich in der Klasse selbst sichtbar. Für abgeleitete Klassen
und für Aufrufer von Instanzen bleiben private-Variablen verdeckt.
 Keine Angabe von public, protected oder private
 Ohne einen der drei Modifier dekrarierte Elemente, werden als package
scoped oder Elemente mit Standard-Sichtbarkeit bezeichnet.
 Sie sind nur innerhalb des Pakets sichtbar, zu dem diese Klasse gehört. In
anderen Paketen sind sie dagegen unsichtbar.
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifikator: public
 Instanzvariablen und Methoden vom Typ public sind im Rahmen ihrer
Lebensdauer überall sichtbar.
 Sie können daher in der eigenen Klasse und von beliebigen Methoden anderer
Klassen verwendet werden.
 Superklassen können auf public-Elemente einer abgeleiteten Subklasse
zugreifen.
 Das Attribut public ist zusätzlich auch bei der Klassendefinition selbst von
Bedeutung, denn nur Klassen, die als public deklariert wurden, sind
außerhalb des Pakets sichtbar, in dem sie definiert wurden.
In jeder Quelldatei darf nur eine Klasse
mit dem Attribut public angelegt werden!
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifier: protected
 Methoden oder Variablen vom Typ protected sind in der aktuellen Klasse
und in abgeleiteten Klassen sichtbar.
 Darüber hinaus sind sie für Methoden anderer Klassen innerhalb desselben
Pakets sichtbar.
 Sie sind jedoch nicht für Aufrufer der Klasse sichtbar, die in anderen Paketen
definiert wurden.
 Superklassen haben Zugriff auf protected-Elemente einer abgeleiteten
Subklasse.
Informatik 2
12
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifikator: private
 Methoden oder Variablen vom Typ private sind
 nur in der aktuellen Klasse sichtbar,
 in allen anderen Klassen bleiben sie dagegen unsichtbar.
 Diese Einschränkung bedeutet nicht, dass die Methoden einer Klasse nur auf
die privaten Instanzvariablen des eigenen Objekts zugreifen dürfen.
 Es ist möglich auf die private-Variablen eines anderen Objekts zuzugreifen,
wenn es sich um eine Instanz derselben Klasse handelt.
 An der Implementierung von setzeNeu() ist zu erkennen, wie der Zugriff
auf fremde Objekte desselben Typs möglich ist:
class KlassePrivat
{
private String a;
public KlassePrivat(String a) { this.a = a; }
public void setzeNeu(KlassePrivat other, String neu)
{ other.a = neu; }
}
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifikator: static
 Variablen und Methoden mit dem Attribut static sind nicht an die Existenz
eines konkreten Objekts gebunden
 Sie existieren vom Laden der Klasse bis zum Beenden des Programms.
 Das static-Attribut beeinflusst bei Instanzvariablen die Lebensdauer.
 Das static-Attribut erlaubt bei Methoden den Aufruf, ohne dass der
Aufrufer ein Objekt der Klasse besitzt, in der die Methode definiert wurde.
 Wird das Attribut static nicht verwendet, so sind Variablen innerhalb einer
Klasse immer an eine konkrete Instanz gebunden.
 Ihre Lebensdauer beginnt mit dem Anlegen des Objekts und dem Aufruf eines
Konstruktors und endet mit der Freigabe des Objekts.
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Modifikator: final
 Instanzvariablen mit dem Attribut final dürfen nicht verändert werden, sind
also als Konstanten anzusehen.
 Methoden des Typs final dürfen nicht überlagert werden.
 Klassen eines des Typs final können nicht zur Ableitung neuer Klassen
verwendet werden.
 Wird das Attribut final dagegen nicht verwendet, sind Instanzvariablen
veränderbar, können Methoden überlagert und Klassen abgeleitet werden.
 Falls eine Methode oder Klasse das Attribut final besitzt, kann der Compiler
auf die dynamische Methodensuche verzichten (später mehr zu Polymorphie).
 final-Methoden können daher performanter aufgerufen werden als normale
Methoden.
 Dies ist einer der Gründe dafür, dass die Java-Designer einige der
mitgelieferten Klassen als final deklariert haben. Es führt aber gleichzeitig dazu,
dass die entsprechenden Klassen nicht mehr erweitert werden können. Ein
prominentes Beispiel aus der Laufzeitbibliothek ist die als final deklarierte
Klasse String.
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Weitere Modifikatoren
 transient
 Instanzvariablen können mit dem Attribut transient belegt werden, um
anzuzeigen, dass sie keine persistente Form besitzen.
 Sie werden beim Serialisieren und Deserialisieren von Objekten dieses Typs
ignoriert.
 volatile
 Dieses Schlüsselwort wird verwendet, um anzuzeigen, dass
Membervariablen asynchron, also außerhalb des aktuellen Threads,
modifiziert werden können.
 Der Wert einer so deklarierten Variable wird daher bei jedem Zugriff erneut
gelesen (anstatt möglicherweise direkt aus einem Register der virtuellen
Maschine genommen zu werden).
 Die Verwendung von volatile ist eher ungebräuchlich. Es kann beispielsweise
zur Sicherstellung der Datenintegrität beim Multithreading verwendet
werden oder dient dazu, Zugriffe auf asynchron veränderliche
Speicherstellen (etwa eine Echtzeituhr, auf die über eine Variable zugegriffen
wird) stets aktuell zu halten.
Informatik 2
16
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Weitere Modifikatoren
 synchronized
 sichert bei mehreren konkurrierend auf Variablen zugreifenden Threads die
Datenkonsistenz.
 native
 Kennzeichnet Methoden, die in einer Platform-abhängigen
Programmiersprache (C, C++, FORTRAN, Assembler) geschrieben ist.
 abstract
 hierzu später mehr…
Informatik 2
17
FH D
Alle Modifikatoren auf einen Blick
Fachhochschule Düsseldorf
University of Applied Sciences
Anwendbarkeit:
Attribut
abstract
final
native
private
protected
public
static
synchronized
transient
volatile
x
x
x
x
x
x
x
Methode
x
x
x
x
x
x
x
x
Konstruktor
x
x
x
Klasse
x
x
Interface
x
x
x
Zugriffsebenen:
public
protected
no modifier
private
Klasse
ja
ja
ja
ja
Paket
ja
ja
ja
nein
Subklasse
ja
ja
nein
nein
Informatik 2
Welt
ja
nein
nein
nein
18
FH D
Alle Modifikatoren auf einen Blick
Fachhochschule Düsseldorf
University of Applied Sciences
Sichtbarkeit:
Paket A
Paket B
Klasse W
Klasse Y
Klasse X
Klasse Z
Klasse W
Klasse X
Klasse Y
Klasse Z
public
ja
ja
ja
ja
protected
ja
ja
ja
nein
no modifier
ja
ja
nein
nein
private
ja
nein
nein
nein
Informatik 2
19
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Modifikatoren
 Der Modifikator static definiert sogenannte Klassenelemente, d.h. es sind im
Gegensatz zu Instanzelementen keine Instanzen der Klasse Voraussetzung für
ihre Existenz.
 Vorsicht: Das heißt aber auch, dass statische Klassenattribute nur einmal im
Speicher vorhanden sind und somit von allen Instanzen „geteilt“ werden!
 Der Modifikator final definiert, dass
 ein Attributinhalt nicht geändert werden kann,
 eine Methode in abgeleiteten Klassen nicht überlagert werden kann,
 von einer Klasse nicht abgeleitet werden kann.
 Kombination static final definiert (globale) Konstanten, z.B. static final double PI
= 3.14159 (Coding Rule: Konstanten werden durchgehend groß geschrieben!)
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Exkurs: Statische Attribute in Java
 Statische Attribute/Konstanten werden nicht im Konstruktor initialisiert, da sie
statisch sind und damit Klassenelemente sind:
class Kreis{
public static final double PI = 3.14159;
}
oder
class Kreis{
public static final double PI;
static{
PI = 3.14159;
}
}
Statischer Initialisierungsblock:
• Wird immer ausgeführt,
wenn Klasse in die
Laufzeitumgebung geladen
wird (in der Regel nur ein mal
zur Laufzeit)!
 Eine Konstante public static final double PI = 3.14159 darf vom Compiler
wegsubstituiert werden!
 Lösung: public static final double PI = Double.valueOf(3.14159).
Informatik 2
3
FH D
Wiederholung: Modifikatoren
Fachhochschule Düsseldorf
University of Applied Sciences
Übersicht (Anwendbarkeit):
Attribut
abstract
final
native
private
protected
public
static
synchronized
transient
volatile
x
x
x
x
x
x
x
Methode
x
x
x
x
x
x
x
x
Konstruktor
x
x
x
Klasse
x
x
Interface
x
x
x
Zugriffsebenen:
public
protected
no modifier
private
Klasse
ja
ja
ja
ja
Paket
ja
ja
ja
nein
Subklasse
ja
ja
nein
nein
Informatik 2
Welt
ja
nein
nein
nein
4
FH D
Wiederholung: Modifikatoren
Fachhochschule Düsseldorf
University of Applied Sciences
Sichtbarkeit:
Paket A
Paket B
Klasse W
Klasse Y
Klasse X
Klasse Z
Klasse W
Klasse X
Klasse Y
Klasse Z
public
ja
ja
ja
ja
protected
ja
ja
ja
nein
no modifier
ja
ja
nein
nein
private
ja
nein
nein
nein
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Tipps zur generellen Auswahl des Zugrifflevels
 Verwenden sie immer private sofern nichts anderes dagegen spricht
(Geheimnisprinzip)!
 Kein private bei zum Beispiel:




Konstruktoren.
Methoden, die in anderen Klassen aufrufbar sein sollen.
Statische Methoden, z.B. public static void main(string args[]).
Konstanten, z.B. public final double PI=3.14159 oder public static final
double e = 2.718281.
 Benutzen Sie public für Attribute ausschließlich für Testzwecke! Vermeiden
Sie Abhängigkeiten von Implementierungsdetails durch public getter- und
setter-Methoden.
 Benutzen Sie protected-Elemente nur, wenn Sie eine Erweiterungsklasse
bereitstellen möchten.
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Getter und Setter
 Vermeiden sie Abhängigkeiten von Implementierungsdetails:
 Abhängigkeit vom Typ eines Attributes.
 Abhängigkeiten von Attributen untereinander, z.B. Ampelfarbe und
Fahren/Halten.
 Abhängigkeit von Wertebereichen von Attributen.
 Implementieren und verwenden sie Getter- und Setter-Methoden für private
Attribute um
1.
2.
3.
4.
Abhängigkeiten aufzulösen,
Validität von Inhalten zu prüfen,
Zugriff zu loggen oder zu debuggen,
Für Benutzer unwichtige Details zu verbergen.
Informatik 2
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Getter und Setter: Konvention
class Benutzer{
private String password;
private boolean valid;
public void setPassword(String password) {
this.password = password;
}
public String getPassword(){return this.password;}
public Boolean isValid(){return this.valid;}
}
 Getter und Setter werden mit Prefix „get“ bzw. „set“ und groß geschriebenem
Attributnamen definiert (Coding Rule).
 Ausnahme Type boolean, hier ist es üblich „is“ statt „get“ zuverwenden.
 Setter habe nie einen Rückgabewert und immer einen Parameter vom Typ des
Attributes.
 Getter haben immer einen Rückgabewert und nie einen Parameter.
Informatik 2
8
FH D
Modifikator: abstract
Fachhochschule Düsseldorf
University of Applied Sciences
 Der Modifikator abstract kann bei Methoden und Klassen verwendet
werden.
 abstract kennzeichnet, dass eine Klasse oder Methode noch nicht
vollständig implementiert ist (Prototyp).
 Ist eine Methode als abstract deklariert, dann muss auch die Klasse
abstrakt sein.
 Abstrakte Klassen können nicht instanziert werden!
 Von einer abstrakten Klassen kann abgeleitet werden, dann muss die
Subklasse alle abstrakten Methoden implementieren.
 Neben abstrakten Methoden können auch Attribute und implementierte
Methoden existieren. abstract class KlasseAbstract{
private String a;
public KlasseAbstract(String a) {
this.a = a;
}
public abstract void setzeNeu(String neu);
}
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Wiederholung: abstract
Fachhochschule Düsseldorf
University of Applied Sciences
 Der Modifikator abstract kann bei Methoden und Klassen verwendet
werden.
 abstract kennzeichnet, dass eine Klasse oder Methode noch nicht
vollständig implementiert ist (Prototyp).
 Ist eine Methode als abstract deklariert, dann muss auch die Klasse
abstrakt sein.
 Abstrakte Klassen können nicht instanziert werden!
 Von einer abstrakten Klassen kann abgeleitet werden, dann muss die
Subklasse alle abstrakten Methoden implementieren.
 Neben abstrakten Methoden können auch Attribute und implementierte
Methoden existieren. abstract class KlasseAbstract{
private String a;
public KlasseAbstract(String a) {
this.a = a;
}
public abstract void setzeNeu(String neu);
}
Informatik 2
2
FH D
Beipiel: Abstrakte Klasse
Fachhochschule Düsseldorf
University of Applied Sciences
Grafisches Objekt
Rechteck
Linie
Bézierkurve
Kreis
Grafische Objekte haben vieles gemeinsam:
 Zustände: Position, Orientierung und Farbe
 Verhalten: rotieren, bewegen, Größe ändern, zeichnen
Trotzdem implementieren grafischen Objekte ihr Verhalten zum Teil unterschiedlich.
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beipiel: Abstrakte Klasse
abstract class GrafischesObjekt{
protected int posX, posY;
…
protected bewegen(int neuX, int neuY){
…
}
abstract protected void zeichne();
abstract protected voide ändereGröße();
}
Subklassen müssen abstrakte Methoden implementieren!
final class Kreis extends GrafischesObjekt{
public void zeichne(){
…
}
public void ändereGröße(){
…
}
}
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Coding Rule: Reihenfolge von Klassenelementen
Eine allgemein geläufige Reihenfolge der Elemente einer Klassendefinition ist
folgende:
1.
2.
3.
4.
5.
6.
Klassenattribute
Instanzattribute
Konstruktoren
Statische Methoden
Getter/Setter
Beliebige Methoden
 Innerhalb der einzelnen Blöcke wird in der Regel nach einschränkender
Sichtbarkeit sortiert.
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klassenhierarchie (Java API)
java.lang.Object
java.awt.Component
java.awt.Button
java.awt.Checkbox
java.awt.TextComponent
java.awt.TextArea
Informatik 2
java.awt.TextField
6
FH D
Anwendung Walzwerk
Fachhochschule Düsseldorf
University of Applied Sciences
Walzwerk (Prozesskette für den Werkstoff Stahl)
Objekte einer Walzstraße
Walzen
Walzensatz
Informatik 2
Gerüst
Walzstraße
7
FH D
Klasse Walzwerk (Java Anwendung)
Fachhochschule Düsseldorf
University of Applied Sciences
package walzwerk;
public class Walzwerk {
public static void main(String[] args) {
// Implementierung der Funktionalität eines Walzwerkes
}
}
 Alle Klassen die Objekte eines Walzwerkes definieren, liegen im package
walzwerk.
 Die Klasse Walzwerk ist unsere Anwendungsklasse mit main-Methode.
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse Walzstrasse
package walzwerk;
 Die Walzstraße ist ein Teil
eines Walzwerkes.
public class Walzstrasse {
private Gerüst[] gerüste;
 Eine Walzstraße besteht
aus Walzgerüsten.
public Walzstrasse(int anzahl) {…}
public Walzstrasse(Gerüst[] gerüste) {…}
 Überladener Konstruktor.
public void baueGerüst(int position, Gerüst gerüst) {…}
public void entferneGerüst(int position, Gerüst gerüst) {…}
public void zeigeGerüste() {…}
 Methoden der
Walzstraße.
}
Informatik 2
9
FH D
Gerüste
Fachhochschule Düsseldorf
University of Applied Sciences
Duo-Gerüst
Quarto-Gerüst
Informatik 2
Sexto-Gerüst
10
FH D
Vererbungshierarchie
Fachhochschule Düsseldorf
University of Applied Sciences
 Ein Duo, Quarto oder Sexto „ist ein“ Gerüst.
 Die Klassen Duo, Quarto und Sexto sollen durch Vererbung die Eigenschaften
und Methoden von der Klasse Gerüst erben.
 Zusätzlich können eigene Eigenschaften und Methoden definiert werden.
abstract class Gerüst
(Basisklasse/Superklasse)
class Duo
class Quarto
class Sexto
 Klassendiagramm:
 Der Pfeil zeigt auf die Basisklasse (auch Superklasse genannt)
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Abstrakte Klasse Gerüst (Prototyp)
package gerüst;
public abstract class Gerüst {
protected double reibung;// Kundengeheimnis
protected double temperatur;// Kundengeheimnis
protected double drehmoment;// Kundengeheimnis
private int wartungsintervall;//in Monaten
private Walze[] walzensatz;
double banddicke, double
bandbreite
// Getter und Setter
…
protected Gerüst(int wartungInMonaten) {…}// nur Package oder Subklasse!
public void setzeUmlaufgeschwindigkeit(double umlaufgeschwindigkeit){…}
public abstract double simulationWalzkraft(double banddicke,
double bandbreite);
public void zeigeWalzensatz() {…}
}
Informatik 2
12
FH D
Klasse Duo
Fachhochschule Düsseldorf
University of Applied Sciences
package gerüst;
public class Duo extends Gerüst {
public Duo(int wartungInMonaten,
double arbeitswalzen_durchmesser) {…}
// Getter und Setter
…
@Override
public double simulationWalzkraft(double banddicke, double bandbreite) {
// Implementierung einer Simulation abhängig von banddicke, bandbreite
// und errechnetem Bandzug unter zur Hilfenahme von
// Reibung, Temperatur, Drehmoment und Umlaufgeschwindigkeit.
return 0.0;
}
}
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse Quarto
package gerüst;
public class Quarto extends Gerüst{
public Quarto(int wartungInMonaten,
double arbeitswalzen_durchmesser,
double stützwalzen_durchmesser) {…}
// Getter und Setter
@Override
public double simulationWalzkraft(double banddicke, double bandbreite) {
// Implementierung einer Simulation abhängig von banddicke, bandbreite
// und errechnetem Bandzug unter zur Hilfenahme von
// Reibung, Temperatur, Drehmoment und Umlaufgeschwindigkeit.
return 0.0;
}
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klassse Walze
package gerüst;
public class Walze {
private double durchmesser;// mm
private double umlaufgeschwindigkeit;// U/min
private double bandgeschwindigkeit;// m/s
private String hersteller;
private String id;
public Walze(String, String, double, double){…}
public Walze(String, double, double){…}
// Getter und Setter
public void zeigeInfo(){…}
private double berechneBandgeschwindigkeit(){…}
}
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klasse Sexto
Übung für Zuhause…
Informatik 2
16
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Wiederholung: Gerüstbeispiel
Fachhochschule Düsseldorf
University of Applied Sciences
 Ein Duo, Quarto oder Sexto „ist ein“ Gerüst.
 Die Klassen Duo, Quarto und Sexto sollen durch Vererbung die Eigenschaften
und Methoden von der Klasse Gerüst erben.
 Zusätzlich können eigene Eigenschaften und Methoden definiert werden.
abstract class Gerüst
(Basisklasse/Superklasse)
(Definition in der letzte Vorlesung!)
class Duo
class Quarto
class Sexto
 Klassendiagramm:
 Der Pfeil zeigt auf die (hier abstrakte) Basisklasse.
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Vererbungshierarchie: Typ 0
class Duo
class Sondergerüst
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Quarto
class Sexto
 Quarto ist ein erweitertes Duo, und ein Sexto ist ein erweitertes Quarto.
 Quarto und Sexto können eigene Methoden simulationWalzkraft()
und setzeParameter() implementieren (Überlagern), müssen es aber
nicht!
 Für jedes Sondergerüst, dass nicht von einem Duo ableitbar ist, gibt es keine
Verbindlichkeiten der zu implementierenden Methoden.
Informatik 2
3
FH D
Vererbungshierarchie: Typ I
Fachhochschule Düsseldorf
University of Applied Sciences
abstract class Gerüst
(Prototyp)
abstract double simulationWalzkraft(…);
abstract void setzeParameter();
class Sondergerüst
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Quarto
class Duo
double simulationWalzkraft(…){…}
void setzeParameter(){…}
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Sexto
double simulationWalzkraft(…){…}
void setzeParameter(){…}
 Jede abgeleitete Klasse muss jetzt abstrakte Methoden implementieren!
 Aber was ist, wenn Duo die Klasse Gerüst um Eigenschaften erweitert die auch
für Quarto eigentümlich sind, bzw. Quarto diese erweitert und diese wiederum
auch für Sexto typisch sind?
Informatik 2
4
FH D
Vererbungshierarchie: Typ II
Fachhochschule Düsseldorf
University of Applied Sciences
abstract class Gerüst
(Basisklasse/Superklasse)
abstract double simulationWalzkraft(…);
abstract void setzeParameter();
 Jetzt müssen gemeinsame
Eigenschaften nicht
wiederholt implementiert
werden.
 Aber was ist, wenn
Sondergerüst völlig andere
Eigenschaften hat als ein
Gerüst, aber trotzdem
simuliert werden soll?
 Erben von einer weiteren
Klasse Simulation wäre hier
wünschenswert.
class Sondergerüst
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Duo
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Quarto
class Sexto
Informatik 2
5
FH D
Interfaces
Fachhochschule Düsseldorf
University of Applied Sciences
 Aber: Mehrfachvererbung von Klassen ist in Java nicht erlaubt.
 Ausweg  Definition eines Interfaces, z.B.:
interface Simulation{
double PI = 3.1415;
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
 Interfaces definieren wie abstrakte Klassen nur Methoden (abstrakte Methoden,
sowie ab JDK 8.0 statische und default-Methoden), aber keine Attribute.
 Interfaces dürfen/können nur (statische) Konstanten definieren.
 Interfaces können nicht instanziert werden.
 Klassen können Interfaces implementieren.
 Interfaces sind immer public oder package-private.
 Interface-Methoden sind immer public.
 Interfaces besitzen keine Konstruktoren.
Informatik 2
6
FH D
Interfaces
Fachhochschule Düsseldorf
University of Applied Sciences
 Interfaces dürfen von beliebigen Interfaces erben (Mehrfachvererbung):
interface SimulationExt extends Berechne1, Berechne2{
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
 Klassen können Interfaces implementieren:
class Duo implements Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite){…}
}
 Kasse können auch mehrere Interfaces implementieren:
class Duo implements Simulation1, Simulation2{
…
}
Informatik 2
7
FH D
Vererbungshierarchie: Typ III
Fachhochschule Düsseldorf
University of Applied Sciences
abstract class Gerüst
(Basisklasse/Superklasse)
abstract void setzeParamater();
double simulationWalzkraft(…){…}
class Sondergerüst
class Duo
void setzeParameter(){…}
double simulationWalzkraft(…){…}
interface Simulation
class Quarto
double simulationWalzkraft(…);
class Sexto
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Erweiterung von Interfaces
 Wie erweitert man Interfaces ohne andere Klassen, die diese implementieren,
unbenutzbar zu machen (Vermeidung von Implementierungsabhängigkeit)?
 Man verwendet Default-Methoden (ab JDK 8.0).
 Beispiel das Interface Simulation soll um zeigeErgebnis()erweitert werden:
interface Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
interface Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite);

default void zeigeErgebnis(){…}
}
 Default-Methoden müssen eine Implementierung besitzen!
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Interfaces und abstrakte Klassen
 Abstrakte Klassen dürfen von beliebigen Interfaces beliebige Methoden
implementieren:
interface Simulation extends Berechne1, Berechne2{
public double simulationWalzkraft(double banddicke,
double bandbreite);
public void zeigeErgebnis();
}
abstract class Gerüst implements Simulation, Auswertung{
public double simulationWalzkraft(double banddicke,
double bandbreite){…}
}
Informatik 2
10
FH D
Vererbungshierarchie: Typ V
Fachhochschule Düsseldorf
University of Applied Sciences
abstract class Gerüst
(Prototyp)
interface Simulation
double simulationWalzkraft(…);
void ändereWalzkraft();
abstract void setzeParameter();
void ändereWalzkraft(){…}
class Sondergerüst
double simulationWalzkraft(…){…}
void ändereWalzkraft(){…}
class Quarto
class Duo
double simulationWalzkraft(…){…}
void setzeParameter(){…}
double simulationWalzkraft(…){…}
void setzeParameter(){…}
class Sexto
double simulationWalzkraft(…){…}
void setzeParameter(){…}
 Dies ist eine besonders generelle und flexible Vererbungshierarchie.
 ändereWalzkraft()ist verbindlich zu implementieren und wird für alle
Gerüste durch den Prototypen bereitgestellt.
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Abstrakte Klassen oder Interfaces?
 Abstrakte Klasse verwendet man, wenn
 Code zwischen sehr eng in Beziehung stehenden Klassen geteilt werden soll,
 die Klassen, die die abstrakte Klasse erweitern, sehr viele Methoden und
Attribute gemeinsam haben,
 andere Zugriffsmodifizierer als public notwendig sind,
 es sollen nicht-statische bzw. nicht konstante Attribute definiert werden.
 Interfaces verwendet man, wenn
 nicht eng in Beziehung stehende Klasse die gleiche Funktionalität
implementieren können. Z.B. die Java API Interfaces Comparable oder
Cloneable,
 man das Verhalten eines beliebigen Types definieren möchte ohne die
konkrete Implementierung zu kennen,
 Multiple Vererbung notwendig ist.
Informatik 2
12
FH D
Fachhochschule Düsseldorf
University of Applied Sciences










Zusammenfassung I
Object ist die Mutter aller Klassen in Java.
Eine Klasse wird über das Schlüsselwort class definiert.
Klassen definieren zugehörige Attribute und ihre Methoden.
Über das Schlüsselwort new werden Instanzen (Objekte) einer Klasse erzeugt.
Bei Instanzierung wird ein Konstruktor zur Initialisierung der Attribute
aufgerufen.
Falls kein (paramterisierter) Konstruktor definiert wurde, wird immer der
Default-Konstruktor verwendet.
Durch das Schlüselwort extends können Klassen von genau einer anderen
Klasse die Attribute und Methoden von dieser erben und erweitern.
Die vererbende Klasse heißt Mutterklasse, Vaterklasse, Basisklasse oder auch
Superklasse.
Die beerbte Klasse heißt Tochterklasse, Sohnklasse, abgeleitete Klasse oder auch
Subklasse.
Zugriffsmodifizierer public,protected, private und packageprivate beeinflussen die Sichtbarkeit der Attribute und Methoden in
abgeleiteten Klassen.
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Zusammenfassung II
 Über das Schlüsselwort super kann auf Eigenschaften der Superklasse
zugegriffen werden.
 super() bezeichnet den Konstruktor der Superklasse.
 Über das Schlüsselwort this kann auf Eigenschaften der Klasse selbst
zugegriffen werden.
 Hinsichtlich dem Geheimnisprinzip sollten Klassenelemente insbesondere
Attribute als private deklariert werden.
 Zugriff auf private Attribute wird über Getter- und Setter-Methoden geregelt.
 Das Schlüsselwort final verhindert, dass eine Klasse abgeleitet werden kann.
 final macht Attribute zu Konstanten und Methoden können nicht überlagert
werden.
 static definiert Klassenelemente im Gegensatz zu Instanzelementen.
 Durch das Schlüsselwort abstract kann eine Methode als Prototyp ohne
Implementierung definiert werden. Dann muss die Klasse auch als abstrakt
deklariert werden.
 Eine abstrakte Klasse kann abstrakte Methoden und implementierte Methoden
enthalten.
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Zusammenfassung III
 In Java gibt es keine Mehrfachvererbung unter Klassen.
 Interfaces definieren abstrakte und öffentliche Methoden und werden durch das
Schlüsselwort interface deklariert.
 Von abstrakten Klassen kann nicht instanziert werden, sondern es kann nur von
ihnen geerbt werden.
 In Interfaces können Default-Methoden, statische Methoden und Konstanten
definiert werden.
 Interfaces können von anderen Interfaces erben (Mehrfachvererbung).
 Klassen können Interfaces implementieren, was durch das Schlüsselwort
implements ausgedrückt wird.
 Klassen können mehrere Interfaces implementieren.
 Abstrakte Klassen können Interfaces (teilweise) implementieren.
 Mit Hilfe von Klassen, abstrakten Klassen, Interfaces und der Vererbung lassen sich
komplexe Vererbungshierarchien erzeugen.
 Klassen, abstrakte Klassen und Interfaces können und sollten in Paketen
organisiert werden (package).
 Pakete werden mit Hilfe des Schlüsselwortes import in den Sichtbarkeitsbereich
eines anderen Paketes bzw. einer anderen Klasse importiert.
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Interfaces
 Aber: Mehrfachvererbung von Klassen ist in Java nicht erlaubt.
 Ausweg  Definition eines Interfaces, z.B.:
interface Simulation{
double PI = 3.1415;
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
 Interfaces definieren wie abstrakte Klassen nur Methoden (abstrakte Methoden,
sowie ab JDK 8.0 statische und default-Methoden), aber keine Attribute.
 Interfaces dürfen/können nur (statische) Konstanten definieren.
 Interfaces können nicht instanziert werden.
 Klassen können Interfaces implementieren.
 Interfaces sind immer public oder package-private.
 Interface-Methoden sind immer public.
 Interfaces besitzen keine Konstruktoren.
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Interfaces
 Interfaces dürfen von beliebigen Interfaces erben (Mehrfachvererbung):
interface SimulationExt extends Berechne1, Berechne2{
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
 Klassen können Interfaces implementieren:
class Duo implements Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite){…}
}
 Kasse können auch mehrere Interfaces implementieren:
class Duo implements Simulation1, Simulation2{
…
}
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Erweiterung von Interfaces
 Wie erweitert man Interfaces ohne andere Klassen, die diese implementieren,
unbenutzbar zu machen (Vermeidung von Implementierungsabhängigkeit)?
 Man verwendet Default-Methoden (ab JDK 8.0).
 Beispiel das Interface Simulation soll um zeigeErgebnis()erweitert werden:
interface Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite);
}
interface Simulation{
public double simulationWalzkraft(double banddicke,
double bandbreite);

default void zeigeErgebnis(){…}
}
 Default-Methoden müssen eine Implementierung besitzen!
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Interfaces und abstrakte Klassen
 Abstrakte Klassen dürfen von beliebigen Interfaces beliebige Methoden
implementieren:
interface Simulation extends Berechne1, Berechne2{
public double simulationWalzkraft(double banddicke,
double bandbreite);
public void zeigeErgebnis();
}
abstract class Gerüst implements Simulation, Auswertung{
public double simulationWalzkraft(double banddicke,
double bandbreite){…}
}
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Interfaces und abstrakte Klassen
 Programmbeispiel:  NetBeans
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Polymorphie („Vielgestaltigkeit“)
 Polymorphie ist die Möglichkeit eines Objektes unterschiedliche Klassen oder
Interfaces als Typ annehmen zu können (Dynamic Binding).
 Das Überladen von Methoden ist bereits (statische) Polymorphie.
 Methoden sind allgemein polymorph, wenn sie in verschiedenen Klassen die
gleiche Signatur besitzen, aber immer neu implementiert sind.
 Sind Methoden in einem Vererbungszweig auf unterschiedlichen
Hierarchieebenen mit gleicher Signatur definiert, wird zur Laufzeit, abhängig
vom Typ des Objektes, die richtige Methode aufgerufen (Late Binding).
 Man nennt den Aufruf dann „virtueller Methodenaufruf“ und die Methoden
„virtuelle Methoden“.
 In Java sind alle Methoden immer virtuell.
Informatik 2
7
FH D
Polymorphie: Beispiel
Fachhochschule Düsseldorf
University of Applied Sciences
 Erstellen wir eine Fahrrad-Hierarchie:
Fahrrad
MountainBike
public class
private
private
private
Rennrad
BMX
Fahrrad{
int kadenz;
int gang;
int geschwindigkeit;
public Fahrrad(int kadenz, int gang, int geschwindigkeit){
setKadenz(kadenz);
setGang(gang);
setGeschwindigkeit(geschwindigkeit);
}
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Polymorphie: Beispiel
public void setKadenz(int kadenz){
this.kadenz = kadenz;
}
public void setGang(int gang){
this.gang = gang;
}
public void setGeschwindigkeit(int geschwindigkeit){
this.geschwindigkeit = geschwindigkeit;
}
public void zeigeBeschreibung(){
System.out.println(“\nFahrrad ist im Gang “ + this.gear
+ “ mit Kadenz “ + this.kadenz +
“ und fährt mit Geschwindigkeit “ +
this.geschwindigkeit + “.”);
}
}
Informatik 2
9
FH D
Polymorphie: Beispiel
Fachhochschule Düsseldorf
University of Applied Sciences
public class MountainBike extends Fahrrad{
private String federung;
public MountainBike(
int kadenz,
int gang,
int Geschwindigkeit,
String federung){
super(kadenz, gang, geschwindigkeit);
setFederung(federung);
}
public void setFederung(String federung){
this.federung = federung;
}
Polymorphie!
public void zeigeBeschreibung(){
super.zeigeBeschreibung();
System.out.println(“Das MountainBike hat eine “ +
this.federung + “ Federung.”);
}
}
Informatik 2
10
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Polymorphie: Beispiel
public class Rennrad extends Fahrrad{
private int reifenbreite;// in (mm)
public Rennrad( int kadenz,
int gang,
int Geschwindigkeit,
int reifenbreite){
super(kadenz, gang, geschwindigkeit);
setReifenbreite(reifenbreite);
}
public void setReifenbreite(int reifenbreite){
this.reifenbreite = reifenbreite;
}
Polymorphie!
public void zeigeBeschreibung(){
super.zeigeBeschreibung();
System.out.println(“Das Rennrad hat “ +
this.reifenbreite + “ mm Reifen.”);
}
}
Informatik 2
11
FH D
Polymorphie: Beispiel
Fachhochschule Düsseldorf
University of Applied Sciences
public class BMX extends Fahrrad{
private …
public BMX(
int kadenz,
int gang,
int Geschwindigkeit,
…){
Übung
…
}
public void setXXXXXXXXXX(…){
…
}
public void zeigeBeschreibung(){
…
}
}
Informatik 2
12
FH D
Polymorphie: Beispiel
Fachhochschule Düsseldorf
University of Applied Sciences
public class TestFahrrad{
public static void main(String[] args){
Fahrrad fahrrad1, fahrrad2, fahrrad3;
Polymorphie!
fahrrad1 = new Fahrrad(20, 10, 1);
fahrrad2 = new MountainBike(20, 10, 5, “DualShock”);
fahrrad3 = new Rennrad(40, 20, 8, 23);
fahrrad1.zeigeBeschreibung();
fahrrad2.zeigeBeschreibung();
fahrrad3.zeigeBeschreibung();
}
}
 Was wird ausgegeben?
Informatik 2
13
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Klassenpolymorphie: Referenztypecasting
 Wir dürfen Referenzvariablen einen anderen Referenztypen zuweisen, sofern
dieser in der Klassenhierarchie tiefer liegt.
 Dies ist ein Typecast vergleichbar mit z.B.
int var1; long var2 = var1;.
Es ist erlaubt, da int in long passt.
 Ähnlich beinhaltet eine Subklasse alles ihrer Superklasse. Daher ist
implizites/explizites Typecasting erlaubt.
 Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht
möglich!
 Auch wenn sich der Typ der Referenz geändert hat, hat sich nicht das Objekt
im Speicher geändert!
class A
 Die Referenz wirkt wie eine Schablone:
class B extends A
A a = new A();
int farbe;
void zeigeFarbe();
B b = new B();
int anzahl;
void zeigeAnzahl
int farbe;
void zeigeFarbe();
A ab = new B();
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Interfacepolymorphie
 Typcasting nach Interfaces ist genauso erlaubt wie Typcasting zu Superklassen:
interface Vergleichbar{
int getVergleichswert();
boolean isEqual(Object o1, Object o2);
}
class A implements Vergleichbar{
public int wert;
public int getVergleichswert(){
return wert;
}
Achtung: Polymorphie!
Zur Laufzeit wird der
Cast geprüft (Dynamic
Binding).
public boolean isEqual(Object o1, Object o2){
Vergleichbar a = (Vergleichbar)o1;
Vergleichbar b = (Vergleichbar)o2;
if (a.getVergleichswert() == b.getVergleichswert())
return true;
else
return false;
}
}
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Polymorphie
 Polymorphie ist die Möglichkeit eines Objektes unterschiedliche Klassen oder
Interfaces als Typ annehmen zu können (Dynamic Binding).
 Das Überladen von Methoden ist bereits (statische) Polymorphie.
 Methoden sind allgemein polymorph, wenn sie in verschiedenen Klassen die
gleiche Signatur besitzen, aber immer neu implementiert sind.
 Sind Methoden in einem Vererbungszweig auf unterschiedlichen
Hierarchieebenen mit gleicher Signatur definiert, wird zur Laufzeit, abhängig
vom Typ des Objektes, die richtige Methode aufgerufen (Late Binding).
 Man nennt den Aufruf dann „virtueller Methodenaufruf“ und die Methoden
„virtuelle Methoden“.
 In Java sind alle Methoden immer virtuell.
Informatik 2
2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Referenztypecasting
 Wir dürfen Referenzvariablen einen anderen Referenztypen zuweisen, sofern
dieser in der Klassenhierarchie tiefer liegt.
 Eine Subklasse erbt alle nicht-privaten Eigenschaften ihrer Superklasse. Daher
ist implizites/explizites Typecasting erlaubt.
 Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht
möglich!
 Auch wenn sich der Typ der Referenz geändert hat, hat sich nicht das real
existierende Objekt im Speicher geändert!
class A
class B extends A
 Die Referenz wirkt wie eine Schablone:
int farbe;
void zeigeFarbe();
A a = new A();
B b = new B();
int anzahl;
void zeigeAnzahl
int farbe;
void zeigeFarbe();
A ab = new B();
 Mit dem Schlüsselwort instanceof lässt sich der Type einer Instanz
abfragen.
Informatik 2
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Cast zu Interface
 Typcasting nach Interfaces ist genauso erlaubt wie Typcasting zu Superklassen:
interface Vergleichbar{
int getVergleichswert();
boolean isEqual(Object o1, Object o2);
}
class A implements Vergleichbar{
public int wert;
public int getVergleichswert(){
return wert;
}
Achtung: Polymorphie!
Zur Laufzeit wird der
Cast geprüft (Dynamic
Binding).
public boolean isEqual(Object o1, Object o2){
Vergleichbar a = (Vergleichbar)o1;
Vergleichbar b = (Vergleichbar)o2;
if (a.getVergleichswert() == b.getVergleichswert())
return true;
else
return false;
}
}
Informatik 2
4
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Achtung: Private Methoden und Polymorphie
 Achtung bei privat deklarierten Methoden im Zusammenhang mit Polymorphie:
class A {
private final int wert = 10;
private void zeigeWert(){
System.out.println(“Der Wert von A lautet” + wert);
}
public void ausgeben(){
zeigeWert();
}
}
class B extends A{
private final int wert = 20;
public void zeigeWert(){
System.out.println(“Der Wert von B lautet” + wert);
}
}
Was wird ausgegeben?
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Referenztypcasting von Superklasse nach Subklasse?
 Wichtig, Typecasting von Superklasse nach Subklasse ist im allgemeinen nicht
möglich:
class A {}
class B extends A{}
class C{
public static void main(String[] args){
A a = new A();
A ab = new B();
Was passiert hier?
B b = (B)a;// Typecast von Superklasse zu Subklasse!!!
B bb = (B)ab;// Typecast von Superklasse zu Subklasse!!!
 Eselsbrücke: Referenzen wirken wie eine Schablone auf das Objekt.
Informatik 2
6
FH D
Fehlerbehandlung: Exceptions
Fachhochschule Düsseldorf
University of Applied Sciences
 Zur Behandlung und Erkennung von (Laufzeit-)Fehlern werden in der Java
Laufzeitumgebung sogenannte Exceptions ausgelöst.
 Exceptions sind Instanzen einer speziellen Klasse der Standardbibliothek.
 In der Standardbibliothek gibt es dafür eine Fehlerklassenhierarchie:
Throwable
Exception
IO
Runtime
Exception
Exception
Error
und viele, viele mehr… (siehe Java Reference)
Informatik 2
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Exceptions-Hierarchie und „Werfen“ von Exceptions
 Throwable: Ist die Superklasse für alle Fehler und Ausnahmen die von der JVM
(Java Virtual Machine) „geworfen“ werden können.
 Zum „Werfen“ von Exceptions dient die Anweisung throw.
Zum Beispiel: class Fehler{
public static void main(String[] args){
throw new RuntimeException();
}
}
 Error: Diese Klasse repräsentiert die schwersten Fehler im System. In der Regel
wird bei diesen Fehler das Programm vollständig beendet.
 Exception: Wichtigste Klasse für allgemeine Ausnahmen. Alle
benutzerdefinierten Exceptions sollten hiervon abgeleitet sein.
 RuntimeException: Behandelt Programmierfehler, die während des
Programmablaufes auftreten können. Dazu gehören u.a.:
 fehlerhafte Typenkonvertierung
 Zugriff über Arraygrenzen hinaus
 Zugriff auf null-Zeiger
 IOException: Input-/Outputfehler, wie zum Beispiel Schreib-/Lesefehler
Informatik 2
8
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Kontrollierte und unkrontrollierte Exceptions
 Alle Methoden in Java die eine Exception auslösen können müssen dies
anzeigen (Checked Exceptions):
class Fehler{
public static void main(String[] args) throws Exception{
throw new Exception();
}
}
 Das Schlüsselwort hierfür heißt throws.
 Des Weiteren muss sichergestellt werden, dass eine Exception auch
„gefangen“ wird:
try{
//Anweisungen
}
catch(Typ Objekt){
//Anweisungen
}
 Ausnahme bilden hierbei Error und RuntimeException und deren Subklassen
(Unchecked Exceptions).
Informatik 2
9
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Beispiel: Exception werfen und fangen
Beispiel:
class TestFehler{
public static void werfeFehler() throws Exception{
throw new Exception();
}
public static void main(String[] args){ Achtung: Hier steht immer
try{
der Typ der Exception die
werfeFehler();
gefangen
werden
soll!
}
catch(Exception e){
System.out.println(“Fehler gefangen!”);
}
}
}
 Exceptions können auch weiter geworfen werden.
Informatik 2
10
FH D
Catch-Block
Fachhochschule Düsseldorf
University of Applied Sciences
 Mit Hilfe des catch-Blocks fängt man eine oder mehrere Ausnahmen vom
entsprechenden Ausnahmetyp:
try{
//Anweisungen
}
catch(Typ1 Objekt){
//Anweisungen
}
catch(Typ2 Objekt){
//Anweisungen
}
catch(Typ3 Objekt){
//Anweisungen
}
 Tritt eine Ausnahme aus kann also gezielt auf diese reagiert werden.
 Jeder Exception-Typ darf dabei nur einmal verwendet werden!
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Benutzerdefinierte Exceptions
 Um eigene Ausnahmen auslösen zu können, muss von einer der in der
Exception-Hierarchie befindlichen Klassen geerbt werden.
 In der Regel wird dies die Klasse Exception sein.
 Ableiten von Error sollte man vermeiden, da diese Art von Ausnahmen schwere
Fehler darstellen und einen sofortigen Abbruch des Programms zur Folge
haben.
class DivisionDurchNull extends Exception{
public DivisionDurchNull(){
super("Division durch Null");
}
}
Informatik 2
12
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Benutzerdefinierte Exceptions
public class TestException {
public static double dividiere(double zähler, double nenner) throws
DivisionDurchNull{
if (nenner == 0)
throw new DivisionDurchNull();
else
return zähler/nenner;
}
public static void main(String[] args){
// TODO code application logic here
try{
System.out.println("Ergebnis 3/5 = " + dividiere(3,5));
System.out.println("Ergebnis 2/0 = " + dividiere(2,0));
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Informatik 2
13
FH D
Finally…
Fachhochschule Düsseldorf
University of Applied Sciences
 Optional darf nach einem catch-Block noch eine finally-Block stehen:
try{
//Anweisungen
}
catch(Typ1 Objekt){
//Anweisungen
}
catch(Typ2 Objekt){
//Anweisungen
}
finally{
//Anweisungen
}
 Der finally-Block ist nützlich um nach einer Exception noch wichtigen
Programmcode auszuführen, z.B. Freigabe von Resourcen oder Schließen von
Dateien.
 Der finally-Block wird quasi immer ausgeführt.
Informatik 2
14
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Behandeln von Ausnahmen innerhalb der Hierarchie
 Generell hat man die Möglichkeit durch catch(Throwable e) auf alle
erdenklichen Exceptions zu reagieren.
 Praktisch könnte man dann z.B. mit instanceof im einzelnen auf
Ausnahmen reagieren. Dies ist schlechter Stil!
 Man sollte im Allgemeinen auf einzelne Exception über einen entsprechenden
catch-Block reagieren.
 Dabei gilt, dass man sich vom Speziellen (Subklasse) zum Allgemeinen
(Superklasse) in der Exception-Hierarchie „durchhangelt“.
public static void main(String[] args){
try{
System.out.println("Ergebnis 2/0 = " + dividiere(2,0));
}
catch (DivisionDurchNull)
{
System.out.println(“Fehler bei Division: “+ e.getMessage);
}
catch(Exception e){
System.out.println(“Allgemeiner Fehler: “+ e.getMessage());
}
}
Informatik 2
15
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Informatik 2
Objektorientierte Programmierung in Java
Prof. Dr.- Ing. André Stuhlsatz
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: Exceptions in Java
 Ausnahmen (Exceptions) sind Instanzen einer speziellen Klassehierarchie der
Standardbibliothek:
Throwable
Exception
IO
Runtime
Exception
Exception
Error
 Zum Auslösen oder „Werfen“ von Exceptions dient die Anweisung throw:
class Fehler{
public static void main(String[] args){
throw new RuntimeException();
}
}
Informatik 2
2
FH D
Wiederholung: Exceptions
Fachhochschule Düsseldorf
University of Applied Sciences
 Alle Methoden in Java die eine Exception auslösen können, müssen dies
mittels throws anzeigen (Checked Exceptions):
class Fehler{
public static void main(String[] args) throws Exception{
throw new Exception();
}
}
 Des Weiteren muss mit catch sichergestellt werden, dass eine Exception
auch „gefangen“ wird:
Versuch (try) eine
try{
Anweisung
//Anweisungen
auszuführen, die
}
catch(Typ Objekt){
eine Ausnahme
//Anweisungen
erzeugen könnte.
}
 Ausnahme bilden hierbei Error, RuntimeException und deren Subklassen
(Unchecked Exceptions).
Informatik 2
3
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Wiederholung: try/catch-Block
 Mit Hilfe des catch-Blocks fängt man eine oder mehrere Ausnahmen vom
entsprechenden Ausnahmetyp:
try{
//Anweisungen
}
catch(Typ1 Objekt){
//Anweisungen
}
catch(Typ2 Objekt){
//Anweisungen
}
finally{
//Anweisungen
}
 Jeder Exception-Typ darf in einem try-catch-Block nur einmal abgefragt
werden!
 Optional darf nach einem catch-Block noch ein finally-Block stehen.
 Der finally-Block wird quasi immer ausgeführt.
Informatik 2
4
FH D
Wiederholung: Benutzerdefinierte Exceptions
Fachhochschule Düsseldorf
University of Applied Sciences
 Eigene Ausnahmen werden durch Ableiten von der throwable-Klasse bzw.
ihrere Subklassen (in der Regel von der Klasse Exception) ermöglicht:
class DivisionDurchNull extends Exception{
public DivisionDurchNull(){
super("Division durch Null");
}
}
 Generell hat man die Möglichkeit durch catch(Throwable e) auf alle
erdenklichen Exceptions zu reagieren.
 Man sollte im Allgemeinen auf einzelne Exception über einen
entsprechenden catch-Block reagieren.
 Dabei gilt, dass man sich vom Speziellen (Subklasse) zum Allgemeinen
(Superklasse) in der Exception-Hierarchie „durchhangelt“.
Informatik 2
5
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Innere Klassen/Interfaces
 Klassen (oder) Interfaces können zur besseren Strukturierung ineinander
verschachtelt werden.
 Eine Definition von inneren Klassen/Interfaces (inner class/inner interface)
erfolgt innerhalb einer anderen Klasse/Interface (outer class/outer interface).
 Bisherige Klassen werden „Top-Level-Klasssen“ genannt.
class TopLevelClass{
…
}
class OuterClass{
class InnerClass{
…
}
…
}
 Motivation von inneren Klassen/Interfaces ist die Bereitstellung von
Hilfsklassen/-interfaces möglichst nahe und gekapselt, wo sie benötigt werden.
 Innere Klassen/Interfaces können auf Eigenschaften der äußeren Klasse
zugreifen (auch auf private!).
Informatik 2
6
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Typen von inneren Klassen in Java
 Es gibt vier Arten von inneren Klassen in Java:
 Geschachtelte Klassen sind Top-Level-Klassen, obwohl sie innerhalb einer
anderen Klasse definiert sind.
 Elementklassen sind ganz allgemein innere Klassen.
 Lokale Klassen werden innerhalb einer Methode oder eines Blockes
definiert.
 Anonyme Klasse sind lokal und namenlos.
Informatik 2
7
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Geschachtelte Klassen
 Geschachtelte Top-Level-Klassen sind mit static deklarierte innere
Klassen: class OuterClass{
static int i;
int j;
public static class StaticInnerClass{
public void setzeI(){
i = 20;
Zugriff ist nur auf
{
statische Elemente
}
der äußeren Klasse
…
möglich!
}
 Objekte von geschachtelten Klassen können auch ohne ein Objekt der
äußeren Klasse existieren:
OuterClass a = new OuterClass();
OuterClass.StaticInnerClass ab = new OuterClass.StaticInnerClass();
 Geschachtelte Top-Level-Klassen dienen nur der Strukturierung
(Namensraumerweiterung).
Informatik 2
8
FH D
Elementklassen
Fachhochschule Düsseldorf
University of Applied Sciences
 Element Klassen sind echte innere Klassen und dienen nicht nur der
Strukturierung.
 Elementklassen haben auf alle Elemente der äußeren Klasse Zugriff, auch auf
private.
 Elementklassen werden analog Top-Level-Klassen gebildet und verwendet,
sie dürfen aber keine statischen Elemente enthalten.
 Objekte von Elementklassen sind immer mit Objekten der äußeren Klasse
verbunden: class A{
}
private int i;
public class B{
public class C{
public C(){i = 5};
}
Objekterzeugung:
public void init(){
A a = new A();
i = 0;
j = 0;
A.B b = a.new B();
{
}
A.B.C c = b.new C();
Informatik 2
FH D
Lokale Klassen
Fachhochschule Düsseldorf
University of Applied Sciences
 Lokale Klassen sind nicht auf oberster Ebene zugreifbar, sondern nur in
Methoden oder Blöcken in denen sie definiert sind:
class A{
…
public void doSomething(){
int i = 0;
class Worker implements Runnable{
public void run{…};
}
new Worker().run();
…
}
…
}
 Lokale Klassen dürfen daher nicht als private,public protected oder static
deklariert werden!
Informatik 2
10
FH D
Lokale Klassen
Fachhochschule Düsseldorf
University of Applied Sciences
 Lokale Klassen dürfen keine statischen Elemente haben.
 Lokale Klassen dürfen nicht den gleichen Namen tragen wie eine umgebene
Klasse.
 Eine lokale Klasse kann nur auf Konstanten (final) des umgeben Codeblocks
zugreifen: class A{
int j = 0;// Zugriff möglich
public void doSomething(){
int i = 0;// kein Zugriff möglich
final k = 0;// Zugriff möglich, weil final
class Worker implements Runnable{
int n=0;
public void run{
n = (k++) * (j++);
};
}
new Worker().run();
…
}
…
}
Informatik 2
11
FH D
Fachhochschule Düsseldorf
University of Applied Sciences
Anonyme Klassen
Anonyme Klassen kann man als lokale „wegwerf“-Klassen bezeichnen.
Sie werden wie lokale Klassen in Methoden bzw. Anweisungsblöcken definiert.
Sie haben die gleichen Einschränkungen wie lokale Klassen.
Sie besitzen keinen Namen und auch keinen Konstruktor.
Anonyme Klassen können nicht mit den Schlüsselwörten extends und
implements verwendet werden.
 Bei Definition entsteht immer gleich das Objekt:





class A{
public void doSomething(){
Runnable Worker = new Runnable(){
public void run{
// mach was…
};
}
Worker.run();
…
}
…
}
Informatik 2
12
Herunterladen