Java-Intensivkurs am IAS

Werbung
Universität Stuttgart
Institut für Automatisierungs- und Softwaretechnik
Prof. Dr.-Ing. Dr. h. c. P. Göhner
Einführung in Java, Teil 3
(Original Titel der Folien: JavaIntensivkurs am IAS)
Vorlesung Informatik I, 24.11.2005, Daniel Huson
© 2000, IAS
1
Überblick
Teil 3:
‹ Overloading, Konstruktoren, Vererbung
‹ Ausnahmebehandlung
Teil 4:
‹ Datenstreams und Dateien
© 2000, IAS
2
Overloading, Konstruktoren, Vererbung
Überladen von Methoden (1)
‹ Überladen von Methoden (Overloading): gleicher
Methodenname, aber unterschiedliche Argumentliste
(Anzahl und Typ)
‹ in Java können nur Methoden überladen werden
(Operatoren-Overloading ist nicht möglich)
‹ Überladen bewirkt Vereinfachung der Schnittstelle: nur ein
Methodenname muss gelernt werden, richtige Methode
wird in Abhängigkeit von Argumentliste aufgerufen
‹ Wichtig: Rückgabetyp kann beim Überladen nicht zur
Unterscheidung verwendet werden
© 2000, IAS
3
Overloading, Konstruktoren, Vererbung
Überladen von Methoden (2)
Beispiel - Initialisierung mit Methoden
class Rechteck1 {
int x1 = 0;
// Punktkoordinaten oben rechts
int y1 = 0;
int x2 = 0;
// Punktkoordinaten unten links
int y2 = 0;
Rechteck initRecht(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
return this;
}
Rechteck initRecht(Point obLinks, Point unRechts) {
x1 = obLinks.x;
y1 = obLinks.y;
x2 = unRechts.x;
y2 = unRechts.y;
return this;
}
}
© 2000, IAS
4
Overloading, Konstruktoren, Vererbung
Konstruktor (1)
‹ besondere Methodenart, die bei der Instanziierung einer
Klasse (new) automatisch aufgerufen wird
‹ Konstruktoren bestimmen die Initialisierung der Objekte
‹ Ablauf der Instanziierung mit new:
• Speicherplatz für Objekt reservieren
• Initialisierung der Instanzvariablen mit Defaultwerten
• Konstruktor-Aufruf
‹ Konstruktor-Definition:
• gleicher Name wie Klasse
• kein Rückgabewert!
‹ Konstruktoren können wie Methoden überladen werden
‹ Aufräumarbeiten können mit der finalize-Methode
veranlasst werden (Dekonstruktor)
© 2000, IAS
5
Overloading, Konstruktoren, Vererbung
Konstruktor (2)
Beispiel - Initialisierung mit Konstruktoren:
class
int
int
int
int
Rechteck {
x1 = 0;
y1 = 0;
x2 = 0;
y2 = 0;
// Punktkoordinaten oben rechts
// Punktkoordinaten unten links
Rechteck(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
Rechteck(Point obLinks, Point unRechts) {
x1 = obLinks.x;
y1 = obLinks.y;
x2 = unRechts.x;
y2 = unRechts.y;
}
}
© 2000, IAS
6
Overloading, Konstruktoren, Vererbung
Vererbung (1)
‹ ermöglicht Hierarchisierung von Klassen
‹ übergeordnete Superklassen vererben Variablen und
Methoden
an Subklassen, d.h. Subklassen erben von Superklassen
‹ in Java erben alle Klassen implizit von der Klasse Object,
welche allgemeingültige Verhaltensregeln definiert
Klassenhierarchie:
CC
AA
Hierarchie-Wurzel: Klasse A
(in Java Klasse Object)
BB
abgeleitete Klasse B, erbt von A
DD
EE
abgeleitete Klassen C, D und E
erben jeweils von B und A
© 2000, IAS
7
Overloading, Konstruktoren, Vererbung
Vererbung (2)
‹ Vererbungsvarianten: Einfach- und Mehrfachvererbung
‹ Einfachvererbung: jede Klasse hat höchstens eine
Superklasse
‹ Mehrfachvererbung: jede Klasse kann von mehreren
Superklassen erben (in Java nicht erlaubt)
Einfachvererbung
(Baum):
Mehrfachvererbung
(Netz):
© 2000, IAS
8
Overloading, Konstruktoren, Vererbung
Vererbung (3)
Beispiel:
class Punkt {
int x;
// x-Koordinate
int y;
// y-Koordinate
void printInfoPunkt() {
System.out.println(“Punkt: “ + x + “/“ + y);
}
}
class Pixel extends Punkt {
String farbe;
// Punktfarbe
}
void printInfoPixel() {
System.out.println(“Pixel: “ + x + “/” + y);
System.out.println(“Pixelfarbe: “ + farbe”);
}
‹ Subklasse erbt automatisch alle Variablen und Methoden
der Superklasse
‹ Regel: Ableiten macht nur Sinn, wenn eine
allgemeingültige Klasse durch neue Methoden/Variablen
erweitert/verändert werden soll
© 2000, IAS
9
Overloading, Konstruktoren, Vererbung
Vererbung (4)
‹ Wie funktioniert ein Methodenaufruf in Java?
• zunächst in der aktuellen Klasse nach passender
Methodendefinition suchen
• falls Suche in aktueller Klasse erfolglos, Aufruf in der
Klassenhierarchie nach oben weiterreichen
‹ Konsequenzen:
• bereits definierte Methoden können in Subklassen ohne
Codeduplizierung wiederverwendet werden
• die Methode einer Superklasse kann in der Subklasse entweder
unverändert übernommen oder überschrieben/redefiniert
werden
‹ Wichtig: Überschreiben (Signatur gleich) nicht mit
Überladen (Argumentliste unterschiedlich) verwechseln!
© 2000, IAS
10
Overloading, Konstruktoren, Vererbung
Methoden überschreiben (1)
‹ Methoden mit identischer Signatur wie in Superklasse, aber
unterschiedliche Methodenkörper
‹ Warum überschreibt man Methoden?
• um geerbte Methoden vollständig zu ersetzen
• um geerbte Methoden zu erweitern
Beispiel:
class PrintKlasse {
int x = 0;
int y = 1;
void drucken() {
System.out.println(“x, y = “ + x + “ “ + y);
}
}
class PrintSubKlasse extends PrintKlasse {
int z = 3;
void drucken() { // geerbte Methode ersetzen
System.out.print(“x, y, z = “ + x + “ “ + y + “ “ + z);
}
}
© 2000, IAS
11
Overloading, Konstruktoren, Vererbung
Methoden überschreiben (2)
‹ das Schlüsselwort super ermöglicht den Zugriff auf die
“verdeckte” Orginalmethode in der Superklasse
Beispiel:
class PrintKlasse {
int x = 0;
int y = 1;
void drucken() {
System.out.println(“x, y = “ + x + “ “ + y);
}
}
class PrintSubKlasse extends PrintKlasse {
int z = 3;
void drucken() { // geerbte Methode erweitern
super.drucken();
System.out.print(“z = “ + z);
}
}
© 2000, IAS
12
Overloading, Konstruktoren, Vererbung
Konstruktoren überschreiben?
‹ Konstruktoren werden grundsätzlich nicht vererbt und
können somit auch nicht überschrieben werden
‹ beim Konstruktoraufruf für ein Objekt werden automatisch
alle Konstruktoren der Superklassen aufgerufen
‹ mit dem Schlüsselwort super wird der “richtige”
Konstruktor der Superklasse aufgerufen
Beispiel:
class BenannterPunkt extends Point{
String name;
BenannterPunkt(int x, int y, String name) {
super(x, y);
this.name = name;
}
}
© 2000, IAS
13
© 2000, IAS
14
Overloading, Konstruktoren, Vererbung
Zugriffsrechte für Klassen
‹ in Java wird die Kapselung (OO-Hauptelement) mit Hilfe
von Schlüsselwörtern (modifier) verwirklicht
‹ für Klassen stehen zwei Zugriffsebenen zur Verfügung:
public und package
public
‹ mit public definierte Klassen sind für alle anderen Klassen
sichtbar
package
‹ ohne zusätzliche Angaben sind Klassen automatisch nur
innerhalb des gleichen Pakets sichtbar (kein packageSchlüsselwort notwendig)
© 2000, IAS
15
© 2000, IAS
16
Overloading, Konstruktoren, Vererbung
Zugriffsrechte für Methoden und Variablen (1)
‹ in Java stehen für Methoden und Variablen 4
Zugriffsebenen zur Verfügung: public, package,
protected und private
‹ das Zugriffs-Schlüsselwort steht vor dem Methoden/Variablen-namen und wird jeweils einzeln vereinbart
public
‹ mit public definierte Methoden/Variablen sind für alle
anderen Klassen sichtbar, d.h. es gibt keine
Zugriffsbeschränkungen
Beispiel:
public class OffeneKlasse {
public int offenesInt;
public String offenerString;
public float offeneMethode() {
...
}
}
© 2000, IAS
17
Overloading, Konstruktoren, Vererbung
Zugriffsrechte für Methoden und Variablen (2)
package
‹ mit dem package-Schlüsselwort werden Klassen
in Pakete gruppiert
‹ falls explizit kein Zugriffsebene definiert wird gilt
automatisch die package-Schutzebene (kein packageSchlüsselwort)
‹ alle Methoden/Variablen dieser Ebenes sind nur innerhalb
des gleichen Pakets sichtbar
Beispiel:
package paket1;
public class PaketKlasse {
int paketInt = 2;
String paketString = “a bis z”;
}
float paketMethode() {
...
}
© 2000, IAS
18
Overloading, Konstruktoren, Vererbung
Zugriffsrechte für Methoden und Variablen (3)
protected
‹ nur Elemente der gleichen und davon abgeleiteter Klassen
haben Zugriff
Beispiel:
public class ProtectedKlasse {
protected int protInt = 4;
protected String pstr = “a bis z”;
protected float protectedMethod() {
...
}
}
public class GleichesPaket {
public void test() {
ProtectedKlasse pk = new ProtectedKlasse();
System.out.println(pk.pstr);
pk.protectedMethod();
}
Nicht erlaubt!
}
© 2000, IAS
19
Overloading, Konstruktoren, Vererbung
Zugriffsrechte für Methoden und Variablen (4)
private
‹ strengster Schutz: Methoden und Variablen nur innerhalb
der eigenen Klasse zugreifbar
‹ im Sinne einer umfassenden Kapselung sollten Daten
möglichst private deklariert werden
‹ spezielle get/set-Methoden ermöglichen den kontrollierten
Zugriff auf die private-Elemente
Beispiel:
public class Kreis {
private int x, y, radius;
public int getRadius() {
return radius;
}
public int setRadius( int value ) {
radius = value;
return radius;
}
}
© 2000, IAS
20
Overloading, Konstruktoren, Vererbung
Zugriffsrechte im Überblick
Klasse
für alle Klassen (auch außerhalb des
Pakets)
nur für Klassen innerhalb des Pakets
public
-
Methode/
Variable
für alle Klassen (auch außerhalb des
Pakets)
nur für Klassen innerhalb des Pakets
public
protected
private
abgeleitete Klassen und Klassen
innerhalb des Pakets
nur für eigene Klasse
Empfehlung:
• Datenelemente (Variablen) private
• Methoden protected
• get-/set-Methoden für Zugriff auf private Daten definieren
© 2000, IAS
21
Overloading, Konstruktoren, Vererbung
final-Modifier (1)
‹ mit dem final-Schlüsselwort können zusätzl. Einschränkungen
definiert werden, die Compiler-Optimierungen ermöglichen
Klassen
‹ mit final deklarierte Klassen können nicht abgeleitet werden
public final class FinalKlasse1 { ... }
Methoden
‹ final-Methoden können in Subklassen nicht überschrieben
werden
public class FinalKlasse2 {
public final void finalMethode() {
...
}
}
‹ alle Methoden in einer final-Klasse sind final
‹ alle private-Methoden sind implizit final
© 2000, IAS
22
Overloading, Konstruktoren, Vererbung
final-Modifier (2)
Variablen
‹ mit final werden in Java Konstanten deklariert
public class FinalKlasse3 {
public final int CONSTINT = 243;
public final String CSTR = “Kaffee”;
}
‹ der konstante Wert wird während der Deklaration
zugewiesen
‹ lokale Variablen können nicht als final deklariert werden
while( summe <= 10 ) {
...
final int LOCALINT;
...
}
Nicht erlaubt!
© 2000, IAS
23
Overloading, Konstruktoren, Vererbung
abstract-Modifier
‹ abstrakte Klassen sind ein Design-Element: mit abstract
gekennzeichnete Klassen können nicht instanziiert werden
‹ in einer abstrakten Klasse werden Methoden ohne
Implementierung (Methodenkörper) mit abstract
gekennzeichnet
Beispiel:
public abstract class AbstrakteKlasse {
int i;
public void tuWas() {
...
}
public abstract void absMethode();
}
Object a = new AbstrakteKlasse();
© 2000, IAS
Nicht erlaubt!
24
Beispiel abstrakte Klasse:
abstract class Geraet {
int seriennummer;
int getSeriennummer () {
return seriennummer;
}
void setSeriennummer (int n)
{
seriennummer=n;
}
abstract void einSchalten ();
}
© 2000, IAS
bis hier
25
Schnittstellen
Problem:
Fahrzeug
“Fahrzeughierarchie”
Wasserfahrzeug
Landfahrzeug
PKW
Ziel:
verwenden, ohne
Lösung:
Motorrad
Amphibienfahrzeug
Schiff
gemeinsames Verhalten
Codeduplizierung
a) Mehrfachvererbung: in Java nicht erlaubt
b) Schnittstellen
© 2000, IAS
26
Fahrzeughierarchie
© 2000, IAS
27
Fahrzeughierarchie
interface Fahrzeug
{
int getMaxGeschwindigkeit ();
int getGewicht ();
Color getFarbe ();
}
interface Landfahrzeug extends Fahrzeug
{
int getAnzahlRader ();
}
interface Wasserfahrzeug extends Fahrzeug
{
int getVerdraengung ();
}
class Amphibienfahrzeug implements Landfahrzeug, Wasserfahrzeug
{
int getMaxGeschwindigkeit () { return 55; }
int getGewicht () { return 1000; }
...
}
© 2000, IAS
28
Overloading, Konstruktoren, Vererbung
Schnittstellen (1)
Problem: “Tierhierarchie”
Tier
Tier
Säugetier
Säugetier
Merkmale:
+ lebende Jungen
+ Fell
Vogel
Vogel
+ legen Eier
+ Schnabel
Wohin gehört das Schnabeltier (Fell & Schnabel)?
Ziel:
gemeinsames Verhalten verwenden, ohne
Codeduplizierung
Lösung:
a) Mehrfachvererbung: in Java nicht erlaubt
b) Schnittstellen
© 2000, IAS
29
Overloading, Konstruktoren, Vererbung
Schnittstellen (2)
‹ Schnittstelle: Sammlung von abstrakten
Methodendeklarationen
und Konstanten ohne Methodenimplementierungen
und Instanzvariablen
Definition
‹ Deklaration mit Schlüsselwort interface
‹ Schnittstellenmethoden sollten als public abstract und
Konstanten als public static final deklariert sein
‹ Schnittstellen gehören zu Paketen und können andere
Pakete importieren
‹ Schnittstellen können mit extends in Hierarchien
organisiert werden
public interface Iface {
public static final int incr = 10;
public static final long maxNum = 1000000;
public abstract void doIt();
}
© 2000, IAS
30
Overloading, Konstruktoren, Vererbung
Schnittstellen (3)
Anwendung
‹ Schnittstellen werden durch das Schlüsselwort implements
in eine Klassendefinition eingebunden
‹ alle in der Schnittstelle deklarierten Methoden müssen von
der einbindenden Klasse implementiert werden
‹ eine Klasse darf mehrere Schnittstellen implementieren
‹ Regel: Schnittstellen können mit wenigen Ausnahmen
überall dort verwendet werden, wo auch Klassen verwendet
werden
Beispiel:
public interface Fruchtartig {
public abstract void verfallen();
public abstract void auspressen();
}
public class Frucht implements Fruchtartig {
private Color farbe;
public void verfallen() { ... }
public void auspressen() { ... }
}
© 2000, IAS
31
Überblick
Teil 3:
‹ Overloading, Konstruktoren, Vererbung
‹ Ausnahmebehandlung
Teil 4:
‹ Datenstreams und Dateien
© 2000, IAS
32
Ausnahmebehandlung
Ausnahmefälle (1)
‹ Design und Implementierung von Klassen und Methoden
beschreiben normalen Ablauf, nicht jedoch den Ablauf in
“Ausnahmefällen”
‹ Java bietet die Möglichkeit, Ausnahmefälle zu deklarieren und
zu behandeln, d.h. ungewöhnliche Situationen werden
handhabbar, ohne den normalen Quellcode aufzubrechen
‹ Ausnahmefälle sind Objekte, die in einer Klassenhierarchie
organisiert sind
‹ Java kennt drei Arten von Ausnahmefällen, die alle von der
Superklasse Throwable abgeleitet sind:
• Ausnahmen (Exception): ClassNotFound, FileNotFound
• Laufzeitausnahmen (RuntimeException):
IndexOutOfBounds
• Fehler (Error): OutOfMemory, StackOverflow
© 2000, IAS
33
Ausnahmebehandlung, Beispiel Rational.java
© 2000, IAS
34
Ausnahmebehandlung, Beispiel Rational.java
class Rational {
int zaehler;
int nenner;
...
Rational (int p,int q) throws Exception {
if(q==0) throw new Exception(“q==0“);
zaehler=p;
nenner=q;
normalize();
}
...
}
© 2000, IAS
35
Ausnahmebehandlung
Ausnahmefälle (2)
Ausnahmefälle deklarieren
‹ Ausnahmefälle, die innerhalb einer Klasse oder Methode
auftreten können, werden mit dem throws-Schlüsselwort
deklariert
public class AusnahmeKlasse {
public void ausnahmeMethode1() throws AusnameFall1 {
...
}
‹ Fehler und Laufzeitausnahmen müssen nicht deklariert
werden
‹ Wenn in einer Methode Ausnahmen auftreten können, müssen
diese a) potentiellen Aufrufern mit der throws-Deklaration
explizit bekanntgegeben werden oder b) von der Methode
selbst gehandhabt werden
© 2000, IAS
36
Ausnahmebehandlung
Ausnahmefälle (3)
Ausnahmen handhaben (Exception Handling)
‹ Ausnahmefälle werden mit den try/catch-Anweisungen
gehandhabt
public void methode2() {
AusnahmeKlasse aKlasse = new AusnahmeKlasse();
try {
// ausnahmeträchtiger Code
aKlasse.ausnahmeMethode1();
} catch ( AusnahmeFall1 ) {
...
}
}
‹ eingetretene Ausnahmen werden in der MethodenAufrufhierarchie nach oben gereicht, bis sie a) behandelt
werden oder b) das Programm mit einer Fehlermeldung
abgebrochen wird
© 2000, IAS
37
Ausnahmebehandlung, Beispiel Rational.java
© 2000, IAS
38
Ausnahmebehandlung, Beispiel Rational.java
...
...
int p=5;
int q=0;
Rational r;
try
{
r=new Rational(p,q);
System.out.println(“ok“);
}
catch (Exception ex)
{
System.out.println(“Fehler:“+ex.getMessage());
}
Ausgabe:
Fehler: q==0
© 2000, IAS
39
Ausnahmebehandlung, Beispiel Rational.java
public class ZeroZaehlerException extends Exception
{
}
------------------...
int p=5;
int q=0;
Rational r;
try
{
r=new Rational(p,q);
System.out.println(“ok“);
}
catch (ZeroZaehlerException ex)
{
System.out.println(“Fehler:“+ex.getMessage());
}
...
© 2000, IAS
40
Ausnahmebehandlung
Javaprogrammierung:
Ausnahmen stehts durch Exceptions
behandlen, nicht durch
Fallunterscheidungen im Code.
schlecht
gut
Rational (int p,int q) throws Exception
{
if(q==0)
throw new Exception (“q==0“);
zaehler=p;
nenner=q;
normalize();
}
© 2000, IAS
Rational (int p,int q) {
if(q==0)
{p=0; q=1;}
zaehler=p;
nenner=q;
normalize();
}
41
Ausnahmebehandlung
Ausnahmefälle (4)
Ausnahmen auswerfen
‹ mit Hilfe der throw-Anweisung werden Ausnahmen
“ausgeworfen”
public class AusnahmeKlasse {
public void ausnahmeMethode1() throws AusnahmeFall1 {
// normaler Code
if( ungewoehnlicherVorfall() ) {
throw new AusnahmeFall1();
// hier wird die Ausfuehrung abgebrochen
}
}
}
‹ tritt eine Ausnahme ein, so werden alle Anweisungen hinter
der throw-Anweisung ignoriert
© 2000, IAS
42
OO-Konzepte & Ausnahmebehandlung
Zusammenfassung
‹ Überladen von Methoden
‹ Konstruktoren
‹ Vererbung
‹ Überschreiben von Methoden/Konstruktoren
‹ Zugriffsrechte für Klassen, Methoden und Variablen
‹ final-Modifier
‹ abstrakte Klassen und Methoden
‹ Schnittstellen
‹ Behandlung von Ausnahmen
© 2000, IAS
43
Herunterladen