Foliensatz4 - Detlef Krömke - Goethe

Werbung
Johann Wolfgang Goethe-Universität
Professur für Graphische Datenverarbeitung
Fachbereich Informatik und Mathematik
Prof. Dr. Detlef Krömker
Interfaces
Ein Interface (Schnittstelle) besteht aus einer Sammlung
von statischen Konstanten und abstrakten Methoden,
die als public deklariert sind
Ein Interface kann als abstrakte Klasse aufgefasst
werden, die nur abstrakte Methodendeklarationen und
statische Kostanten umfasst
Ashraf Abu Baker
[email protected]
Java-Intensivkurs WS07/08
Folie 1
Interfaces
public interface GeometricObjectInterface {//Interface
declaration
public static final int CIRCLE=0;
public static final int RECTANGLE=1;
public static final int SQUARE=2;
Interfaces werden mit dem Schlüsselwort interface
deklariert, dürfen keine Konstruktoren definieren und
können daher nicht instanziiert werden
Java-Intensivkurs WS07/08
Folie 2
Interfaces
Interfaces werden erstellt, um von Klassen implementiert zu werden
Eine Klasse, die ein Interface implementiert, muss alle Methoden
des Interfaces überschreiben:
public class Circle implements GeometricObjectInterface{
public int getType();
public float radius;
public abstract float getCircumference();
//Berechnet den Umfang eines geometrischen Objektes
}
Alle in einem Interface definierten Attribute sind
automatisch statische Konstanten, die initialisiert
werden müssen
Java-Intensivkurs WS07/08
Folie 3
public Circle(float radius){this.radius=radius;}
public int getType(){
return GeometricObjectInterface.CIRCLE;}
public float getCircumference(){
return (float)(2*Math.PI*radius);}}
Java-Intensivkurs WS07/08
Folie 4
Interfaces
Interfaces
Eine Klasse, die nicht alle Methoden eines Interfaces implementiert,
muss als abstract deklariert werden
public class Square implements
GeometricObjectInterface{
Interfaces können wie Klassen voneinander abgeleitet werden
public float side;
Interfaces können als ein restriktiver Mechanismus für
Mehrfachvererbung verwendet werden
public Square(float side){this.side=side;}
public float getCircumference(){ return 4*side;}
So kann eine Klasse mehrere Interfaces implementieren. Sie muss
dann zu jedem Interface alle darin definierten Methoden
implementieren:
public int getType(){
return GeometricObjectInterface.SQUARE;
}
}
Java-Intensivkurs WS07/08
Folie 5
Java-Intensivkurs WS07/08
Folie 6
Das Interface Comparable
Eine Klasse, die dieses Interface implementiert, definiert
eine Ordnung auf ihre Objekte und macht sie paarweise
vergleichbar
Comparable
public class ComparablePoint extends Point implements
Comparable{
public float x1;
public float y1;
Ihre Objekte können z.B. von Sortiermethoden sortiert
werden
public interface
Comparable<T>{
public int compareTo(T o);
}
Java-Intensivkurs WS07/08
Folie 7
@Override
public int compareTo(ComprablePoint p) {
if(x1<p.x1 || this.y1<p.y1) return -1;
if(x1==p.x1 || this.y1==p.y1) return 0;
return 1;
}
}
Java-Intensivkurs WS07/08
Folie 8
Comparable
Alle Wrapper-Klassen und viele andere Klassen wie
String, Date, File… implementieren das Comparable
Interface
Namenskonventionen
Ein Namenskonvention ist eine Empfehlung wie Pakete, Klassen,
Variablen, Methoden, Interfaces… etc. sinnvoll bezeichnet werden
sollen
Paketnamenskonvention:
Paketnamen sollten aus Kleinbuchstaben bestehen
Sollten kurze Nomen (Substantive) sein
Sie dürfen auch Ziffern enthalten
Beispiel:
de.frankfurt.cs.gdv.visian3d
Java-Intensivkurs WS07/08
Folie 9
Namenskonventionen
Klassennamen:
Java-Intensivkurs WS07/08
Folie 10
Namenskonventionen
Methodennamen:
Beginnen mit einem Großbuchstaben und sollten Nomen
(Substantive) sein
Beginnen mit Kleinbuchstaben
Sollten Verbe get(), run(), save()… sein
Besteht ein Klassenname aus mehreren Silben wie z.B.
BinaryNode, RedBlackTree so beginnt jeder Silbe beginnt
ebenfalls mit einem Buchstaben
Beispiele:
Besteht ein Methodenname aus mehreren Silben wie z.B.
getUserName() so beginnt jeder Silbe beginnt
mit einem Buchstaben
Point, ComplexNumber, VisualBinarySearchTree…
Boolesche Funktionen sollten mit „is“, „has“, „can“, etc.
anfangen
run(), getLeftChild(),setName(), isReady(), shouldWait()..
Java-Intensivkurs WS07/08
Folie 11
Java-Intensivkurs WS07/08
Folie 12
Namenskonventionen
Variablennamen:
Beginnen mit Kleinbuchstaben
Namenskonventionen
Konstantennamen:
Bestehen aus Großbuchstaben
Silben werden durch einen Unterstrich getrennt
Darauffolgende Silben fangen mit einem Großbuchstaben an
Sie sollten kurz und ausdrucksstark sein
SIZE, MAX_VALUE, EDGE_COLOR
Boolesche Variablen sollten mit „is“, „has“, „can“ etc. anfangen
age, userName, isVisible, hasTicket, canStart, shouldRestarted….
Java-Intensivkurs WS07/08
Folie 13
Namenskonventionen
Interfaces :
Beginnen mit einem Großbuchstaben und sollten Nomen
(Substantive) sein
Silben beginnen ebenfalls mit einem Buchstaben
GeometricObjectInterface
Java-Intensivkurs WS07/08
Folie 14
Object, Math und String
Object ist die Oberklasse aller Java-Klassen
Jede Klasse, die nicht explizit von einer anderen Klasse
abgeleitet wird, wird implizit von Object abgeleitet
class A {
}
//ist äquivalent zu
class A extends Object {
}
Klasse Object verfügt über zahlreiche Methoden:
Java-Intensivkurs WS07/08
Folie 15
Java-Intensivkurs WS07/08
Folie 16
Object
public String toString():
Bankkonto alexKonto=new Bankkonto(35870,"Alex M.",2103);
System.out.println(alexKonto);
Liefert eine String-Darstellung eines Objektes zurück
Object
Bankkonto@3e25a5
Wird z.B. von der Methode System.out.println() aufgerufen
Standardimplementierung der Methode liefert den
Klassennamen und den HashCode des Objektes im
Hexdezimal-Format als String zurück:
Will man eine sinnvolle String-Darstellung des Objektes haben,
dann muss die Methode überschrieben werden:
//Standardimplementierung von toString() in der Klasse Object
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
Java-Intensivkurs WS07/08
Folie 17
Object
Überschreibung der toString-Methode in Bankkonto
//Überschreibung von toString() in Bankkonto
public String toString(){
return "Kontoinformation:\r\n"+
"Kontonummer: "+kontoNummer+"\r\n"+
"Kontoinhaber(in): "+inhaber+"\r\n"+
"Kontostand: "+kontoStand+" €\r\n";
}
Bankkonto alexKonto=new Bankkonto(35870,"Alex M.",2103);
System.out.println(alexKonto);
Ausgabe:
Kontoinformation:
Kontonummer: 2150
Kontoinhaber(in): Alex M.
Kontostand: 12350.0
Java-Intensivkurs WS07/08
Folie 19
Java-Intensivkurs WS07/08
Folie 18
Objektvergleiche
Zwei Möglichkeiten, Objekte zu vergleichen
Mit "=="
boolean equals(Object o)
Für primitive Variablen überprüft „==„ , ob die beiden Variablen
den gleichen Wert haben
Für Referenzen überprüft „==„ , ob zwei Referenzen auf
dasselbe Objekt verweisen
- Es werden die Referenzwerte (Speicheradressen) verglichen
Java-Intensivkurs WS07/08
Folie 20
Objektvergleiche
HashCode
boolean equals(Object o)
Ein HashCode ist:
Überprüft zwei verschiedene Objekte auf inhaltliche Gleichheit
(Vergleicht die Objekte nicht die Referenzen)
Die standardmäßige Implementierung von boolean
equals(Object o) führ lediglich einen Referenzvergleich durch
und ist somit äquivalent zu „==„
boolean equals(Object o) sollte in der eigenen Klasse
überschrieben werden
//Standardimplementierung von equals(Object o) in der
Klasse Object
public boolean equals(Object o){
return this==o;}
Ein Integerwert
Repräsentiert die Eindeutigkeit eines Objektes
Zwei Objekte, die gemäß der equals()-Methoden gleich sind,
müssen den gleichen HashCode haben
Wird verwendet in den Collections (Datenstruktren), die
hashbasiert sind
Java-Intensivkurs WS07/08
Folie 21
Java-Intensivkurs WS07/08
Folie 22
Enthält nur einen privaten Konstruktor
instanziiert werden
kann nicht
//Kompilierfehler: The constructor Math() is not visible
Math math=new Math();
Java-Intensivkurs WS07/08
Folie 23
ü
Enthält eine Sammlung von mathematischen Methoden
und Kostanten
Ist als final deklariert
darf nicht abgeleitet werden
Math
Math
abs(int i)
Absolutbetrag von i
ceil(double d)
Nächste Ganzzahl größer gleich i
exp(double a)
ea
floor(double d)
Nächste Ganzzahl kleiner gleich i
log(double a)
ln(a)
max(int i1, i2)
Maximum der Zahlen i1 und i2
min(int i1, i2)
Minimum der Zahlen
pow(double a, double b)
ab
random()
Eine Zahl aus dem Intervall[0.0,1.0]
sin(double d)
Sinus-Funktion
cos(double d)
Kosinus-Funktion
tan(double d)
Tangens-Funktion
round(double d)
Rundet d zur nächsten Ganzzahl
Java-Intensivkurs WS07/08
Folie 24
i1 und i2
String
Eine Zeichenkette (String) in Java ist eine indizierte
geordnete Folge von Unicode-Zeichen
Indexierung beginnt bei 0
Strings sind unveränderbar (immutable)
Strings ist final
Ein String-Objekt kann entweder mit einem Konstruktor
der Klasse String oder als String-Literal erstellt werden
Java-Intensivkurs WS07/08
Folie 25
String
public static void stringCompare(){
String s1=new String("use the equals()-method to compare strings");
String s2=new String("use the equals()-method to compare strings");
String s3="use the equals()-method to compare strings";//StringLiteral
String s4="use the equals()-method to compare strings";//StringLiteral
boolean s1_s2= false , s3_s4=false s2_s3=false;
if(s1==s2) s1_s2=true;
if(s3==s4) s3_s4=true;
if(s2==s3) s2_s3=true;
System.out.println(s1_s2+" "+s3_s4+" "+s2_s3);
s2=s3;
if(s2==s3) s2_s3=true;
System.out.println(s2_s3);
Ausgabe: false true false
true
Java-Intensivkurs WS07/08
Folie 26
String
int length():
Liefert die Länge der Zeichenkette zurück
charAt(int index):
String
trim():
Liefert den String zurück, der entsteht, wenn alle Leerzeichen
am Anfang und am Ende des Strings entfernt werden
Liefert das Zeichen an Position index zurück
- index muss zwischen 0 und length()-1 liegen,
sonst wird eine java.lang.StringIndexOutOfBoundsException
geworfen
substring(int begin, int end):
Liefert den Teilstring zurück, der am Index begin beginnt und
am Index end-1 einschließlich endet
substring(int begin):
Liefert den Teilstring von der angegebenen Position bis zum
Ende des Strings zurück
Java-Intensivkurs WS07/08
Folie 27
equalsIgnoreCase():
Vergleicht String miteinander ohne Groß-/Kleinschreibung zu
beachten
toLowerCase()
Wandelt den String in Kleinbuchstaben um, liefert ihn zurück
toUpperCase():
Wandelt den String in Großbuchstaben um, liefert ihn zurück
Java-Intensivkurs WS07/08
Folie 28
String
replace(char oldChar, char newChar):
Ersetzt alle vorkommen des Zeichens oldChar durch das
Zeichen newChar:
Exceptions
Ausnahmen (Exceptions) sind Java-Klassen zur
Erkennung und Behandlung von Laufzeitfehlern
Ein Laufzeitfehler ist ein Fehler, der während der
Ausführung eines Programms auftritt und während des
Kompiliervorganges nicht erkannt werden kann
Ein Exception-Objekt repräsentiert einen Laufzeitfehler,
der den normalen Ablauf des Programms stört oder gar
beendet
Java-Intensivkurs WS07/08
Folie 29
Exceptions
Drei Arten von Fehlern
Vermeidbare Fehler (Bugs):
Das sind Fehler, die durch den Programmierer verursacht
werden und praktisch vermieden werden können
- Division durch 0
- Zugriff auf einen ungültigen Arrayindex
- Zugriff auf eine null-Referenz
Java-Intensivkurs WS07/08
Folie 31
Java-Intensivkurs WS07/08
Folie 30
Fehlerarten in Java
Unvermeidbare Fehler:
Ein Programm versucht auf einen Server zuzugreifen,
der gerade ausgeschaltet ist
Ein Programm versucht eine Datei zu öffnen, die
beschädigt ist bzw. gelöscht wurde
Ein Programm fordert den Benutzer auf eine Zahl
einzugeben. Stattdessen gibt der Benutzer ein String ein
Java-Intensivkurs WS07/08
Folie 32
Fehlerarten in Java
Systemfehler (System Errors):
Das sind schwerwiegende nicht behebbare Fehler, nach deren
Auftreten die Fortsetzung des Programms nicht sinnvoll bzw.
gar nicht möglich ist
Führen zu einem Programmabbruch und zur Beendigung des
Interpreters
- Beispiele: Speicherüberlauffehler (Memory Overflow), Fehler in
der JVM
Java-Intensivkurs WS07/08
Folie 33
Fehlerbehandlung
Die Behandlung von Ausnahmen erfolgt mittels der try-catchAnweisung:
//try to convert a string to a number
convertStringToNubmer(String numberString){
try{
float number = Float.parseFloat(numberString);
System.out.println("Converting "+numberString+
" to a number succeeded: "+number);
}//Catching the exception
catch (NumberFormatException exceptionObject){
//handling the exception
System.out.println("Exception: Unable to convert "
+numberString+" to a number!");
System.out.println(exceptionObject.getMessage());
System.out.println("Printing the stack trace...");
exceptionObject.printStackTrace(); }}
Java-Intensivkurs WS07/08
Folie 35
Fehlerbehandlung
Zur Behandlung von Laufzeitfehlern stellt Java das ExceptionKonzept zur Verfügung
Wenn ein Programmteil (eine Methode oder Anweisung) einen
Fehler verursacht, löst die JVM eine Ausnahme (throwing
exception), die vom Programm abgefangen (catching exception)
und behandelt (handling exception) werden kann
Zur Behandlung einer Ausnahme übergibt die JVM an das
Programm ein Exception-Objekt, das Informationen über den
Fehler enthält wie z.B. Fehlerart, Fehlerbezeichnung
Programmzustand zum Zeitpunkt des Auftreten des Fehlers …etc
Java-Intensivkurs WS07/08
Folie 34
Fehlerbehandlung
convertStringToNubmer("549.34");
Ausgabe: Converting 549.34 to a number succeeded: 549.34
convertStringToNubmer("549,34");
Ausgabe: Exception: Unable to convert 549,34 to a number!
For input string: "549,34"
Printing the stack trace...
java.lang.NumberFormatException: For input string: "549,34"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown
Source)
at java.lang.Float.parseFloat(Unknown Source)
at
exceptions.SimpleException.convertStringToNubmer(SimpleException.java:
25)
at exceptions.SimpleException.main(SimpleException.java:39)
Java-Intensivkurs WS07/08
Folie 36
Throwable
Die Vaterklasse aller Exceptions ist die Klasse
java.lang.Throwable
Zwei wichtige Methoden:
getMessage()
Wenn ein Laufzeitfehler auftritt, generiert die JVM ein
Ausnahme-Objekt und speichert in ihm eine Textnachricht
getMessage() gibt diese Nachricht zurück
printStackTrace() liefert eine Art Momentaufnahme des
Programmstacks (stack trace) zum Zeitpunkt des Auftretens des
Fehlers in Form einer Textnachricht zurück
Java-Intensivkurs WS07/08
Folie 37
Ausnahmetypen
Zwei Arten von Ausnahmen
Geprüfte Ausnahmen (checked exceptions)
Laufzeitausnahmen (runtime exceptions)
Laufzeitausnahmen repräsentieren vermeidbare Fehler
int x=1/3;
int y=2/x;//Division durch null -->
// Laufzeitausnahme: ArithmeticException:/by zero
Beispiele: ArrayIndexOutOfBoundsException,
NegativeArraySizeException, NullPointerException und
StringIndexOutOfBoundsException
Java-Intensivkurs WS07/08
Folie 38
Ausnahmetypen
Die geprüften Ausnahmen dagegen repräsentieren
unvermeidbare Fehler und Systemfehler
Beispiele
FileNotFoundException
und IOException
public
void printFile(String
fileName){
//try to read and print the given file
BufferedReader input = null;
try {
input = new BufferedReader( new
FileReader(fileName) );
String line = null;
while (( line = input.readLine()) != null){
System.out.println(line);
}
}
catch (IOException ex){
ex.printStackTrace();}
Java-Intensivkurs WS07/08
Folie 39
Ausnahmetypen
Alle aus der Klasse java.lang.RunTimeException
abgeleiteten Exceptions sind Laufzeitausnahmen
Laufzeitausnahmen können, jedoch müssen nicht abgefangen
und behandelt werden
try{
int x=1/3;
int y=2/x
}catch(ArithmeticException exceptionObject){//Catching the exception
//handling the exception
System.out.println("x ist 0. Division wurde nicht
ausgeführt!");
}
Java-Intensivkurs WS07/08
Folie 40
Ausnahmetypen
Alle aus der Klasse java.lang.Exception abgeleiteten
Exceptions sind geprüfte Exceptions
Geprüfte Ausnahmen dagegen müssen vom Programmierer
mittels einer try-catch-Anweisung immer abgefangen und
behandelt werden
Auslösen einer Exception
Der Programmierer kann Methoden definieren, die
selbst Ausnahmen auslösen:
Eine Methode kann eine oder mehrere Ausnahmen werfen
Dies erfolgt mithilfe der throws Anweisung
public long factorial(int n) throws NegativeValueException {
//if n<0 then throw an exception
if(n<0) throw new NegativeValueException ("invalid
parameter: "+n);
//else return factorial(n)
}
Java-Intensivkurs WS07/08
Folie 41
Java-Intensivkurs WS07/08
Folie 42
Behandeln einer Exception
Da factorial() eine geprüfte Ausnahme wirft (siehe APIDokumentation), muss jede andere Methode, die
factorial() aufrufen will, dies innerhalb einer try-catchAnweisung tun
public long calculator(int n) {
// the calculator method calls the factorial method
try{
return factorial(n);
} catch (Exception exceptionObject){
System.out.println("The input parameter of factorial "+
+"must be a positive number!");
Weitergabe von Exceptions
Es ist auch möglich das Abfangen und die Behandlung
einer Ausnahme an die aufrufende Methode
weiterzugeben, wie das folgende Beispiel zeigt:
public long calculator(int n) throws Exception {
int x= n/2;
return factorial(x);
}
}
Java-Intensivkurs WS07/08
Folie 43
Java-Intensivkurs WS07/08
Folie 44
Behandlung von mehreren Ausnahmen
public void printFile(String fileName){
//try to read and print the given file
BufferedReader input = null;
try {
input = new BufferedReader( new FileReader(fileName) );
String line = null;
finally
Am Ende einer try-catch-Anweisung kann ein finallyBlock stehen
Der fianlly-Block wird immer ausgeführt, unabhängig davon, ob
eine Ausnahme aufgetreten ist oder nicht
while (( line = input.readLine()) != null){
System.out.println(line);
}
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
catch (IOException ex){
ex.printStackTrace();
}
}
Java-Intensivkurs WS07/08
Folie 45
finally
public void finalyMethod(){
try{
Random rand=new Random();
int x=rand.nextInt(6);
System.out.println("x="+x);
int y=2/x;//Division durch null -->ArithmeticException:/by 0
}
catch (ArithmeticException arithmeticExceptionObject){
System.out.println("ArithmeticException...");
}
finally{
System.out.println("Finally-Block");
}
}
Java-Intensivkurs WS07/08
Folie 47
Java-Intensivkurs WS07/08
Folie 46
Erstellung eigener Exception-Klassen
Zur Erstellung einer eigenen Exception-Klasse,
muss entschieden werden, ob die neue Ausnahme eine geprüfte
oder eine Laufzeitausnahme sein soll
Eine Laufzeitausnahme muss von der Klasse
java.lang.RuntimeException oder von einer ihrer Unterklassen
abgeleitet werden
Eine geprüfte Ausnahme muss von der Klasse
java.lang.Exception oder von einer ihrer Unterklassen
abgeleitet werden
Die Klasse soll zwei Konstruktoren deklarieren, einen
parameterlosen Konstruktor und einen Konstruktor, der als
Parameter eine Textnachricht (message) übergeben bekommt
Java-Intensivkurs WS07/08
Folie 48
Erstellung einer geprüften Exception
/**
* Checked exception used in the method factorial of the class
* SimpleException
*
*/ public class NegativeValueException extends Exception{
public NegativeValueException(){
Erstellung einer Laufzeit-Exception
/**
* Runtime exception used in the method auszahlen() of the class
* exceptions.Bankkonto
*/
public class KreditLimitUeberschrittenException extends
RuntimeException{
public KreditLimitUeberschrittenException(){
}
public NegativeValueException(String message){
super(message);
}
}
public KreditLimitUeberschrittenException(String message){
super(message);
}
}
}
Java-Intensivkurs WS07/08
Folie 49
Java-Intensivkurs WS07/08
Folie 50
Herunterladen