inhalt intensivkurs java innere klassen operatoren streamskfg/java/javaf.pdf · inhalt intensivkurs...
Post on 08-Aug-2019
228 Views
Preview:
TRANSCRIPT
��
��♣Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
1
��
��♣Inhalt Advanced Java
Serialisierung Java BeansRemote Method Invocation Enterprise Java BeansServlets SicherheitNative Methoden InternationalisierungReflexion Entwicklungswerkzeuge
2
��
��♣Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
3
��
��♣”Hello-World”-Programm
public class GutenTag
{public static void main (String[] argument)
{System.out.println ("Guten Tag!");
}}
4
��
��♣Klassenname, Filenamen
GutenTag.java
$ javac GutenTag.java
GutenTag.class
$ java GutenTag
Guten Tag!
5
��
��♣main-Methode
public static void main (String[] argument)
{}
6
��
��♣Produkt von zwei Zahlen
import java.io.*;
public class Produkt
{public static void main (String[] argument)
{double[] zahl = new double[2];
7
��
��♣Produkt von zwei Zahlen
for (int i = 0; i < 2; i++)
{System.out.print ("Bitte Zahl ");
System.out.print (i + 1);
System.out.print (" eingeben: ");
System.out.flush ();
8
��
��♣Produkt von zwei Zahlen
try{zahl[i] = new Double (
new BufferedReader (new InputStreamReader (System.in)).readLine ()).doubleValue ();
// oder ausfuhrlich:
//InputStreamReader s = new InputStreamReader (System.in);
//BufferedReader t = new BufferedReader (s);
//Double d = new Double (t.readLine ());
//zahl[i] = d.doubleValue ();
}
9
��
��♣Produkt von zwei Zahlen
catch (IOException e)
{System.err.println ("IOException wurde geworfen!");
}catch (NumberFormatException e)
{System.err.println ("NumberFormatException "
+ "wurde geworfen!");
}}
10
��
��♣Produkt von zwei Zahlen
System.out.print ("Das Produkt von ");
System.out.print (zahl[0]);
System.out.print (" mit ");
System.out.print (zahl[1]);
System.out.print (" betragt ");
System.out.println (zahl[0] * zahl[1]);
}}
11
��
��♣Produkt von zwei Zahlen
$ javac Produkt.java
$ java Produkt
Bitte Zahl 1 eingeben: 3.2
Bitte Zahl 2 eingeben: 6
Das Produkt von 3.2 mit 6 betragt 19.200000000000003
$
12
��
��Schmier-Programm
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Schmier extends JApplet
implements ActionListener,
ItemListener, MouseMotionListener
{// ...
}
13
��
��Schmier-Programm
private Container behalter;
private int altesX = 0;
private int altesY = 0;
private Color aktuelleFarbe = Color.black;
private JButton loeschKnopf;
private JComboBox farbWahl;
private JButton endeKnopf;
14
��
��Schmier-Programm
private static final String schwarz = "Schwarz";
private static final String rot = "Rot";
private static final String gelb = "Gelb";
private static final String grun = "Grun";
private static final String blau = "Blau";
15
��
��Schmier-Programm
public void init ()
{behalter = this.getContentPane ();
behalter.setLayout (new FlowLayout ());
behalter.setBackground (Color.gray);
loeschKnopf = new JButton ("Loschen");
loeschKnopf.addActionListener (this);
loeschKnopf.setForeground (Color.black);
loeschKnopf.setBackground (Color.lightGray);
behalter.add (loeschKnopf);
16
��
��Schmier-Programm
farbWahl = new JComboBox ();
farbWahl.addItemListener (this);
farbWahl.addItem (schwarz);
farbWahl.addItem (rot);
farbWahl.addItem (gelb);
farbWahl.addItem (grun);
farbWahl.addItem (blau);
farbWahl.setForeground (Color.black);
farbWahl.setBackground (Color.lightGray);
behalter.add (new JLabel ("Farbe: "));
behalter.add (farbWahl);
behalter.addMouseMotionListener (this);
}
17
��
��Schmier-Programm
public void actionPerformed (ActionEvent ereignis)
{Object ereignisQuelle = ereignis.getSource ();
if (ereignisQuelle == loeschKnopf)
{repaint ();
}
18
��
��Schmier-Programm
else if (ereignisQuelle == endeKnopf)
{System.exit (0);
// Nur bei Applikation erlaubt,
// bei Applet nicht erlaubt.
}}
19
��
��Schmier-Programm
public void itemStateChanged (ItemEvent e)
{if (e.getItem () == schwarz)
aktuelleFarbe = Color.black;
else if (e.getItem () == rot)
aktuelleFarbe = Color.red;
else if (e.getItem () == gelb)
aktuelleFarbe = Color.yellow;
else if (e.getItem () == grun)
aktuelleFarbe = Color.green;
else if (e.getItem () == blau)
aktuelleFarbe = Color.blue;
}
20
��
��Schmier-Programm
public void mouseDragged (MouseEvent e)
{Graphics g = behalter.getGraphics ();
g.setColor (aktuelleFarbe);
g.drawLine (
altesX, altesY, e.getX (), e.getY ());
altesX = e.getX ();
altesY = e.getY ();
}
21
��
��Schmier-Programm
public void mouseMoved (MouseEvent e)
{altesX = e.getX ();
altesY = e.getY ();
}
22
��
��Schmier-Programm
public void addiere (JComponent komponente)
{behalter.add (komponente);
}
23
��
��Schmier-Programm
public static void main (String[] argument)
{Schmier s = new Schmier ();
s.init ();
s.endeKnopf = new JButton ("Ende");
s.endeKnopf.addActionListener (s);
s.endeKnopf.setForeground (Color.black);
s.endeKnopf.setBackground (Color.lightGray);
s.addiere (s.endeKnopf);
24
��
��Schmier-Programm
JFrame f = new JFrame ("Schmier");
f.pack (); // Trick: Erzeugt Peer-Frame
f.getContentPane ().add (s, BorderLayout.CENTER);
f.setSize (600, 400);
s.start ();
f.setVisible (true);
}
25
��
��Schmier-HTML-Datei
<HTML>
<HEAD>
<TITLE>Das Schmier-Applet</TITLE>
</HEAD>
<BODY>
Wenn Sie einen Java-fahigen Browser benutzen,
bitte schmieren Sie im unten angegebenen Applet rum.
Ansonsten haben Sie Pech gehabt.
<P>
<APPLET code="Schmier.class" width=600 height=400>
</APPLET>
</BODY>
</HTML>
26
��
��Schmier-HTML-Datei
$ javac Schmier.java
$ java Schmier
$ appletviewer Schmier.html
$ netscape file:‘pwd‘/Schmier.html
27
��
��♣Geschichte von Java
• 1990: James Gosling ”Oak”
• 1993: Java-Team(Gosling, Joy, Steele, Tuck, Yellin, van Hoff)
• 1995: Erstes Java Developer Kit (JDK 1.0)
• 1996: JDK 1.0.2 erste brauchbare Version
• 1997: Version JDK 1.1
• 1998: Version JDK 1.2, Java 2
• 1999: Java 2, J2SE, J2ME, J2EE
28
��
��♣Merkmale von Java
• Plattformunabhangigkeit(Einsatz in allen moglichen Systemen: Mobiltelefon,Modem, Drucker, Fernsehen, Waschmaschine, Prozes-sautomatisierung, Bankensoftware)
• JVM (Java Virtual Machine) kann Betriebssystem furalle Computer sein. Ist etwa 200 KByte groß.
• Funktionalitat und Interaktivitat fur WWW
• Software muss nicht mehr gespeichert werden, sondernkann ubers Netz auf aktuellem Stand geholt werden.
29
��
��♣Merkmale von Java
• einfach • architekturunabhangig• objekt-orientiert • portabel• verteilt • hochleistungsfahig• interpretiert • Multithread-fahig• robust • dynamisch• sicher
30
��
��♣Objektorientierte Programmierung
• Identitat von Objekten
• Klassifizierung
• Polymorphismus
• Vererbung
31
��
��♣Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
32
��
��♣Java-Programm
• Klassen- und Schnittstellendefinitionen
• Eigenstandige Anwendung: Irgendeine Klasse mussmain definieren.
• public static void main (String[] arg)
• arg[0] ist wirklich erstes Argument,nicht Klassenname.
• Kein Ruckgabewert. Workaround:System.exit (intRueckgabeWert)
33
��
��Argumente von main
public class GutenTagArg
{public static void main (String[] argument)
{System.out.println ("Guten Tag!");
for (int i = 0; i < argument.length; i++)
{System.out.print ("Argument ");
System.out.print (i);
System.out.print (" war: ");
System.out.println (argument[i]);
}System.out.println ();
}}
34
��
��♣Umgebungsvariable
String heimVerzeichnis
= System.getProperty ("user.home");
Weitere Umgebungsvariable sind z.B.:
user.name
user.dir
java.version
java.home
java.class.version
os.name
35
��
��♣Namensraum
•Weltweit eindeutige Namen.
• Keine globalen Variablen oder Methoden.
• Variable und Methoden sind Klassenelemente.
• Klassen gehoren zu Paketen.
• Paketnamen leiten sich vom Verzeichnis ab,sind damit an den Ort gekoppeltund dadurch automatisch eindeutig.
36
��
��♣Namensraum
PaketName.KlassenName.variablenNamePaketName.KlassenName.methodenName ()
Beispiel:
//ba-stuttgart.de/kfg/lang/java/GutenTagArg.class
Paketname : de.ba-stuttgart.kfg.lang.java
Klassenname : GutenTagArg
Methodenname : main
37
��
��♣Quellcode-Datei .java
• Quellcode-Datei hat Erweiterung .java .
• Kann mehrere Klassen enthalten.
• Nur eine Klasse darf public sein.
• Quellcode-Dateiname = Name dieser Klasse + .java
38
��
��CLASSPATH
Unix:
setenv CLASSPATH .:/home/kfg/jvKlassen:/usr/local/jvKlassen
Windows:
SET CLASSPATH=.;a:\kfg\jvKlassen;c:\lokal\jvKlassen
39
��
��♣Statement package
• package lang.java.konten;
• Erstes Statement nach Kommentaren.
• Datei muss in dem entsprechenden Verzeichnis liegen.
•Wenn Statement fehlt, dann Default-Paket.
40
��
��♣Statement import
• Spart Schreibarbeit. Abgekurzte Namen.
• Nichts wird ”eingelesen”.
• Erscheinen nach dem optionalenpackage-Statement.
41
��
��Statement import
1. import Pa.cka.ge.name;
2. import Pa.cka.ge.name.Klasse;
3. import Pa.cka.ge.name.*;
42
��
��Sichtbarkeit – Scope
globalpublic
Paketdefault
Klasseprivate
Subklasseprotected
43
��
��♣Lokale Variable
•Werden innerhalb von Blocken definiert und
• sind nur dort bekannt.
• Argumente von Methoden sind lokal.
44
��
��Konstanten
public class Mathematik
{public static final double EULER = 2.7182;
public final double FAKTOR;
}
45
��
��♣Unicode
• 16-Bit Zeichen
• Zeichen, Strings, Identifikatoren
• 0x0000 bis 0x00FF ist gleich ISO8859-1
• Escape-Sequenzen \uxxxx, \xxx, \n, \t usw
• Beispiel: "\"" lautet alternativ "\\u0022" .
46
��
��♣Standarddatentypen
Typ enthalt Default Bit Bereich
boolean Bool’scher Wert false 1 true oder false
char Unicode-Zeichen \u0 16 \u0000 bis \uFFFF
byte ganze Zahl 0 8 -128 bis 127
short ganze Zahl 0 16 -32768 bis 32767
int ganze Zahl 0 32 -2147483648 bis2147483647
long ganze Zahl 0 64 -9223372036854775808 bis9223372036854775807
float IEEE-754 Zahl 0.0 32 ±3.40282347E+38 bis±1.40239846E-45
double IEEE-754 Zahl 0.0 64 ±1.797693134862231570E+308±4.94065645841246544E-324
47
��
��♣Standarddatentypen
• boolean-Werte konnen nicht von oder in einen anderenTyp gewandelt werden.
•Werte vom Typ char haben kein Vorzeichen.
• Konstanten vom Typ long: 387L oder 387l
• float und double Gleitkommazahlen: 1.4F, 1.4f,3.9D, 3.9d
48
��
��♣Standarddatentypen
• In den Klassen java.lang.Float und java.lang.Double
sind die Konstanten POSITIVE_INFINITY, NEGATIVE_INFINITY,
NaN (not a number), MAX_VALUE (großter Absolutwert),
MIN_VALUE (kleinster Absolutwert) definiert.
• Ganzzahlige Division durch Null wirft eine
ArithmeticException.
Gleitkommadivision durch Null:
POSITIVE_INFINITY oder NEGATIVE_INFINITY.
• Schnittstelle java.util.Enumeration.
49
��
��Referenzdatentypen
•Objekte (object)
• Felder (array)
50
��
��Referenzdatentypen
• In Java gibt es keine Zeiger,
(bzw alle Referenzdatentypen sind eigentlich Zeiger.)
• Es gibt keine ”Adresse-von”- oder Dereferenzierungs-Operatoren.
• Ein Objekt wird mit new erzeugt.
• Zwei Referenzdatentypen konnen auf dasselbe Objekt zeigen.
• Es gibt keine Zeigerarithmetik, keine Berechnung von Objekt-
großen, keine Manipulation von Speicheradressen.
• Defaultwert ist null.
51
��
��Zuweisung
a = b;
a zeigt jetzt auf dasselbe Objekt wie b.a ist keine Kopie von b.
Kopie:a = b.clone ();
52
��
��Vergleichbare Klasse
public class Zei implements Cloneable
{public char c;
public Zei (char c) { this.c = c; }
public boolean equals (Object z)
{ return c == ( (Zei)z).c; }
53
��
��Kopierbare Klasse
public class Zei implements Cloneable
{public Object clone ()
{Object kopie = null;
try
{kopie = super.clone ();
}catch (CloneNotSupportedException e)
{e.printStackTrace ();
}return kopie;
}}
54
��
��Vergleich
a == b;
Pruft, ob a auf dasselbe Objekt wie b zeigt.
Gleichheit von Objekten wird gepruft mit:a.equals (b);
55
��
��Erzeugung von Objekten
Zei c;
c = new Zei (’X’);
Zei d = new Zei (’Y’);
String s = new String ("Guten Tag!");
String t = "Guten Tag!";
String r = "Guten Tag!";
56
��
��Felder
byte[] f1 = new byte[20];
Zei[] f2 = new Zei[20];
int[] f3 = {27, 47, 67, 114};String[] s = {"Gu", "ten", " ", "Tag"};
Klasse[] f = {new Klasse (...), new Klasse (...),
new SubKlasse (...), ... };
int[] f4 = new int[] {27, 47, 56, 67}
57
��
��Mehrdimensionale Felder
short[][] m1 = new short[47][114];
long[][][][] m2 = new long[36][][][];
long[][][][] m3 = new long[36][12][][];
long[][][][] m4 = new long[36][][12][]; // Fehler
long[][][][] m5 = new long[][17][12][]; // Fehler
58
��
��verschiedene Zeilenlangen
int[][] dreieck = new int[17][];
for (int i = 0; i < dreieck.length; i++)
{dreieck[i] = new int[i + 1];
}
59
��
��Verschachtelte Initialisierung
int[][] m6
= { {5, 2}, {7, 9, 1, 6, 7}, {5, 3, 9} };
60
��
��Boxing und Unboxing
Integer ib = 5; // box
int i = ib; // unbox
ib++; // unbox, increment, box
Integer jb = ib + 7;
// unbox ib, calculate, box result int jb
List<Integer> n = new ArrayList<Integer> ();
n.add (47); // box
int i = n.get (0); // unbox
61
��
��Modifikatoren
• final : Kann auf Klassen, Methoden und Variable angewendet
werden.
• native : Kann auf Methoden angewendet werden.
• synchronized : Kann auf Klassen- und Instanzmethoden ange-
wendet werden.
• transient : Kann auf Variable angewendet werden, die nicht zum
dauerhaften (persistent) Zustand eines Objekts gehoren.
• volatile : Kann auf Variable angewendet werden und bedeutet,
dass die Variable ihren Wert asynchron andern kann.
62
��
��Modifikatoren
• volatile : Kann auf Datenelemente angewendet werden und
bedeutet, dass das Datenelement seinen Wert asynchron andern
kann.
• transient : Kann auf Datenelemente angewendet werden, die
nicht zum dauerhaften (persistent) Zustand eines Objekts
gehoren. Transiente Felder werden nicht mit dem Objekt seriali-
siert.
63
��
��Typen-Literale
Class intTyp = int.class
Class intFeldTyp = int[].class
Class zeiTyp = Zei.class
Class intTyp = Integer.TYPE
64
��
��Zeichenketten
• Klasse java.lang.String
• nicht \0-terminiert
• Konkatenierung mit Operator ”+”
• ”Hallo” ist String-Objekt
• String-Objekte sind nicht veranderbar.Dafur gibt es die Klasse StringBuffer.
65
��
��Methoden von String
int length ()
char charAt (int i)
boolean equals (Object s2)
int compareTo (String s2)
String substring (int von)
String substring (int von, int bis)
String replace (char alt, char neu)
66
��
��String Pool
String t = new String ("irgendetwas");
t == "irgendetwas" ergibt false.String s = new String ("irgendetwas").intern ();
s == "irgendetwas" ergibt true.t = t.intern ();
t == "irgendetwas" ergibt nun auch true.
67
��
��Methoden von java.util.ArrayList
public ArrayList ();
public int size ();
public void add (Object ob);
public Object get (int i);
public Object remove (int i);
public Object[] toArray ();
68
��
��Methoden von java.util.ArrayList<T>
public ArrayList<T> ();
public int size ();
public void add (T t);
public T get (int i);
public T remove (int i);
public T[] toArray (T[] at);
69
��
��Methoden von java.util.ArrayList
public ArrayList ();
public int size ();
public void add (Object ob);
public Object get (int i);
public Object remove (int i);
public Object[] toArray (Object[] ob);
70
��
��Methoden von java.util.Vector
public Vector ();
public int size ();
public synchronized void add (Object ob);
public synchronized Object get (int i);
public synchronized boolean remove (Object ob);
public synchronized Object remove (int i);
public synchronized Enumeration elements ();
public synchronized int copyInto (Object[] ob);
71
��
��Feld als Liste
import java.util.*;
public class FeldAlsListe
{public static void main (String[] argument)
{// Definition eines Feldes:
String[] a = new String[] { "A", "B" };
// Verwandlung des Feldes in eine Liste:
List b = new ArrayList (Arrays.asList (a));
72
��
��Feld als Liste
// Manipulation der Liste:
b.add ("C");
// Ruckverwandlung der Liste in ein Feld:
a = (String[]) b.toArray (new String[0]);
// Ausdruck des Feldes:
for (int i = 0; i < a.length; i++)
{System.out.print (a[i] + " ");
}System.out.println ();
}}
73
��
��Aufzahlungstyp enum
import java.util.*;
public class EnumDemo
{enum Wochentag {Montag, Dienstag, Mittwoch, Donnerstag, Freitag,
Samstag, Sonntag};
public static void main (String[] arg)
{ArrayList<Wochentag> wtliste = new ArrayList<Wochentag> ();
wtliste.add (Wochentag.Montag);
wtliste.add (Wochentag.Mittwoch);
wtliste.add (Wochentag.Freitag);
wtliste.add (Wochentag.Sonntag);
74
��
��Aufzahlungstyp enum
System.out.println ("Wir arbeiten nur an den Tagen:");
for (Wochentag wt : wtliste)
{System.out.println ("\t" + wt);
}System.out.println ();
75
��
��Aufzahlungstyp enum
System.out.println ("Als Argumente wurden gelesen:");
Wochentag next;
for (String s : arg)
{next = null;
try
{next = Wochentag.valueOf (Wochentag.class, s);
}catch (Exception e) { e.printStackTrace (); }
System.out.println ("Gelesener String: \"" + s
+ "\" Wochentag: " + next);
}
76
int i = 0;
do {next = wtliste.get (i);
switch (next)
{case Montag:
case Dienstag:
case Mittwoch:
case Donnerstag:
case Freitag: System.out.println (next + " ist ein Arbeitstag.");
break;
case Samstag: System.out.println ("Am " + next + " wird nur manchmal gearbeitet.");
break;
case Sonntag: System.out.println ("Am " + next + " wird ganz selten gearbeitet.");
break;
}i++;
} while (next != Wochentag.Sonntag);
77
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
78
��
��Uberladung von Operatoren ?
Die Uberladung von Operatoren ist in Java nicht moglich.
Ausnahme: Der binare Operator ”+” ist auch fur Objekteder Klasse String definiert und bedeutet dort Konkate-nierung.
79
��
��Unare Operatoren
Unare Operatoren wirken auf ein Datenelement.
Sie sind rechts-assoziativ,d.h. -++a wird als -(++a)nicht als ++(-a) interpretiert.
80
��
��Binare Operatoren
Die binaren Operatoren verknupfen zwei Datenelementeund sind alle – mit Ausnahme der Zuweisungsoperatoren– links-assoziativ.
81
��
��Binare Operatoren
a + b + c + d bedeutet ((a + b) + c) + d .
Aber a = b = c = d = 1 bedeutet a = (b = (c = (d = 1))) .
a *= b += c = d -= 1 bedeutet
a *= (b += (c = (d -= 1))) .
82
��
��Ternarer Operator
x ? y : z
83
��
��Reihenfolge der Auswertung
ist unbestimmt.
int a = 0;
(a *= 2) == ++a;
Nur ”&&” und ”||” garantieren,dass der linke Ausdruck zuerst ausgewertet wird.
84
��
��Keine Operatoren sind
• Subskript (”[]”)
• Funktionsaufruf (”()”)
• new• Namensauflosung (”.”)
• Kommaoperator außer in for-Schleife
• sizeof gibt es nicht.
85
��
��Division und Modulo
• Division ”/” wird bei ganzzahligen Großen ganzzahligdurchgefuhrt.
• 11 mod 3 wird dargestellt als 11 % 3
86
��
��Bitweises Verschieben
• a << b
• a >> b
• a >>> b
87
��
��Logische Operatoren
• Bei den logischen Operatoren ”&” und ”|” werden im-mer beide Seiten ausgewertet.
• Bei den logischen Operatoren ”&&” und ”||” wird even-tuell nur die linke Seite ausgewertet.
88
��
��Typvergleich
Ausdruck instanceof Typ
89
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
90
��
��Anweisungen
• Einfachste Anweisung: ”;”
• ”a = b + c;”
• Block: ”{ }”
{int b = 0;
a = b + c;
b++;
}
91
��
��Bedingte Anweisung
if (a > 0)
{b = c / a;
c++;
}else
{System.out.println ("a nicht positiv!");
b = 0;
}
92
��
��Fallunterscheidung
char c;
// ---
switch (c)
{case ’a’:
x = xa;
break;
case ’b’:
case ’c’: x = xb; break;
default:
x = 0;
break;
}
93
��
��while-Schleife
a = 10;
while (a > 0)
{b = c / a;
a--;
}
94
��
��do-while-Schleife
a = 10;
do {b = c / a;
a--;
} while (a > 0);
95
��
��for-Schleife
for (int i = 0; i < 10; i++)
{a[i] = i;
b[i] = i * i;
}
96
��
��Enhanced for-Loop
for (Klasse x :k)
{x.methode ();
}
97
��
��Sprunge
• Es gibt kein Goto, aber goto ist reserviert.
• break• break Sprungmarke
• continue• continue Sprungmarke
98
��
��Sprunge
int a = 0;
hierher: for (int i = 0; i < 10; i++)
{a++;
for (int j = 0; j < 20; j++)
{a++;
if (a == 5) continue;
if (a == 6) break;
if (a == 7) continue hierher;
if (a == 8) break hierher;
a++;
}a++;
}
99
��
��Wertruckgabe
Mit der return Anweisung wird die Kontrolle wieder andie aufrufende Methode zuruckgegeben, wobei ein Aus-druck des Resultattyps der aufgerufenen Methode zuruck-zugeben ist.
100
��
��Methodendefinition
Modifikatoren Ruckgabetyp Methodenname (Kommalistevon Argumenten){Implementation}
101
��
��Methodendefinition
public double methode (int a, double x, char z)
{double y;
y = a * (z - ’0’);
return x * y;
}
102
��
��Argumente variabler Lange
public static int min (int a, int... b)
{int min = a;
for (int i : b)
{if (i < min) min = i;
}return min;
103
��
��Argumente variabler Lange
min (5)
min (7, 4)
min (7, 4, 12, 3, 6)
min (7, new int[] {4, 12, 3, 6})
104
��
��Argumente variabler Lange
public static int min (int a, int[] b)
public void methode (Object... o)
105
��
��Zusicherungen
assert assertion;
oder
assert assertion : errorcode;
java -ea:Klasse Klasse
AssertionError
106
��
��♣Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
107
��
��Klassenmerkmale
• Bildung neuer Typen, die den Bedurfnissen der ProgrammierIn
Daten zu reprasentieren genugen.
• Kontrolle des Zugangs zu Daten: Datenstrukturen konnen vor
dem direkten Zugriff des Benutzers geschutzt werden (Daten-
abstraktion, Datenkapselung, information hiding).
• Initialisierung und Aufgabe von Objekten kann fur den Benutzer
transparent erfolgen.
• Vermeidung von Code-Wiederholungen durch Vererbungsmecha-
nismen.
• Bildung von typunabhangigen Datenstrukturen.
108
��
��Klassendefinition
public class Klassenname // Klassenkopf,
// class head
{ // Klassenkorper,
} // class body
Konvention: Klassenname beginnt mit Großbuchstaben.
109
��
��Datenabstraktion
private Daten
public Elementfunktionen, Methodenpublic Zugriffsfunktionen
oder weitere Moglichkeiten mit:protected und default
110
��
��Klasse Klausurnote
public class Klausurnote
{private String fach;
private char[] note = new char[3];
public void setFach (String Fach) { }public int setNote (String Note) { }public String getNumerisch () { }public String getVerbal () { }public void drucke () { }}
111
��
��Klasse HauptKlausurnote
public class HauptKlausurnote
{public static void main (String[] argument)
{Klausurnote bio = new Klausurnote ();
bio.setFach ("Biologie");
bio.setNote ("2,3");
bio.drucke ();
}}
112
��
��setFach
public void setFach (String Fach)
{fach = Fach;
}
113
��
��setNote
public int setNote (String Note)
{int n = Note.length ();
if ((n > 3) || (n == 0)
|| (n > 1 && Note.charAt (1) != ’,’)
)
{System.out.print ("Note \"" + Note);
System.out.println ("\" ist keine gultige Note!");
return -1;
}
114
��
��setNote
switch (Note.charAt (0))
{case ’5’:
if (n == 3 && Note.charAt (2) != ’0’)
{ /* Fehlermeldung */ return -1; }case ’4’: case ’3’: case ’2’: case ’1’:
note[0] = Note.charAt (0);
note[1] = ’,’;
115
��
��setNote
if (n < 3) note[2] = ’0’;
else if (Note.charAt (2) >= ’0’ && Note.charAt (2) <= ’9’)
note[2] = Note.charAt (2);
else
{System.out.print ("Note \"" + Note);
System.out.println ("\" ist keine gultige Note!");
return -1;
}return 0;
default: // Fehlermeldung
return -1;
}}
116
��
��getNumerisch
public String getNumerisch ()
{return new String (note);
}
117
��
��getVerbal
public String getVerbal ()
{double x = zahl ();
if (x < 0.99) return "ungultig";
else if ( x < 1.51) return "sehr gut";
else if ( x < 2.51) return "gut";
else if ( x < 3.51) return "befriedigend";
else if ( x < 4.01) return "ausreichend";
else return "nicht ausreichend";
}
118
��
��drucke
public void drucke ()
{System.out.print ("Die Note ");
System.out.print (fach);
System.out.print (" ist ");
System.out.print (getVerbal ());
System.out.print (" (");
System.out.print (getNumerisch ());
System.out.println (").");
}
119
��
��private Elemente
private double zahl ()
{double x = note[0] - ’0’;
x = x + (note[2] - ’0’) / 10.0;
return x;
}}
120
��
��this
Mit der Variablen this wird immer das geradevorliegende Objekt referenziert.
this.note[1]
Klarung von Namenskonflikten.
Falls Methodenresultat vorliegendes Objekt ist,return this;
121
��
��Konstruktor
•Wird ein einziges Mal beim Erzeugen eines Objekts mitnew aufgerufen.
• Eine Klasse kann mehrere Konstruktoren haben.
• Hat den gleichen Namen wie die Klasse.
• Hat keinen Ruckgabewert; erzeugt Objekt.
122
��
��Konstruktoren
public class Klassenname
{public Klassenname (int i, int j) {}public Klassenname (double x) {}public Klassenname () {}}
123
��
��Beispiel Klausurnote
public Klausurnote (String Note, String Fach)
{if (setNote (Note) == -1)
{ note[0] = ’0’; note[1] = ’,’; note[2] = ’0’; }setFach (Fach);
}public Klausurnote (String Note)
{this (Note, "N.N.");
}public Klausurnote ()
{this ("");
}
124
��
��this ()
•Mit dem Schlusselwort this () werden andereKonstruktoren derselben Klasse aufgerufen.
• Der Konstruktoraufruf this () kann nur inKonstruktoren erfolgen und muss dort als erstesStatement erscheinen.
125
��
��Anwendung von Konstruktoren
public class HauptKlausurnote
{public static void main (String[] argument)
{Klausurnote bio = new Klausurnote ();
bio.setFach ("Biologie");
bio.setNote ("2,3");
Klausurnote phy = new Klausurnote ("1,8");
Klausurnote che = new Klausurnote ("3,1", "Chemie");
}}
126
��
��Default-Konstruktor
Ein Konstruktor ohne Argumente heißtDefault-Konstruktor.
Der Default-Konstruktor wird vom Compiler nur dannautomatisch erzeugt, wenn es keine vom Klassen-Implementor definierte Konstruktoren gibt.
127
��
��Instanz-Initialisatoren
sind namenlose Code-Blocke, die an beliebiger Stelle in derKlasse auftreten konnen.Sie werden in der Reihenfolge ihres Auftretens nach demSuperklassen-Konstruktor, aber vor allen anderen Kon-struktoren abgearbeitet.Damit kann man z.B. Objektfelder an der Stelle ihres Auf-tretens initialisieren, was die Lesbarkeit des Codes erhohenkann, und anonyme Klassen initialsisieren.
128
��
��Aufgabe von Objekten
• ist nicht Sache des Programmierers.garbage collection, GC
• Empfehlung an GC moglich:int[] riesig = new int[1000000];
// benutzt riesig
// riesig wird nicht mehr benotigt
riesig = null;
• Vor Deallokierung wird finalize aufgerufen.
• System.gc ();
129
��
��Destruktor-Methode finalize
• Der Java-Interpreter kann verlassen werden, ohne dass der
Garbage-Kollektor die Moglichkeit hat, alle Objekte zu deallokie-
ren.
• Es ist nicht spezifiziert, wann und in welcher Reihenfolge der
Garbage-Kollektor die Objekte deallokiert.
• Eine finalize-Methode kann das Objekt wieder zum Leben er-
wecken, indem this wieder einer Variablen zugewiesen wird. In
solch einem Fall wird finalize nicht wieder aufgerufen, wenn
das Objekt schließlich deallokiert werden kann.
• finalize-Methoden konnen Exceptions werfen. Wenn diese Ex-
ceptions nicht gefangen werden, werden sie ignoriert.
130
��
��Beispiel finalize
protected void finalize () throws Throwable
{System.out.print ("Die Note ");
System.out.print (fach);
System.out.print (" (");
System.out.print (getVerbal ());
System.out.print (" (");
System.out.print (getNumerisch ());
System.out.println (")) wird gleich deallokiert.");
super.finalize ();
}
131
��
��Die Aktivitat des GC
kann man mit der Option -verbosegc beobachten:public class Speicherfresser
{public static void main (String[] arg)
{int i = 0;
while (true)
{i++;
System.err.println ("Iteration " + i);
double[] d = new double[10000];
for (int j = 0; j < d.length; j++) d[j] = Math.random ();
}}
}
132
��
��Klassenvariable und -methoden
•Werden static deklariert.
• Klassenvariable sind Datenelemente, auf die alleInstanzen der Klasse zugreifen konnen.
• Klassenvariable und -methoden konnen ohne Instanzangesprochen werden, nur mit dem Klassennamen.
•Moglichkeit zur Emulation von”globalen” Variablen.
133
��
��Beispiel Klassenvariable
public class Klausurnote
{// ---
static int anzKlausurnoten = 0;
// ---
}
134
��
��Verwendung von Klassenvariablen
Klausurnote a = new Klausurnote ();
a.anzKlausurnoten = 5;
Klausurnote.anzKlausurnoten = 6;
135
��
��Klassenmethoden
public class Klausurnote
{// ---
public Klausurnote besser (Klausurnote b)
{if (zahl () < b.zahl ()) return this;
else return b;
}
public static Klausurnote besser (Klausurnote a, Klausurnote b)
{if (a.zahl () < b.zahl ()) return a;
else return b;
}// ---
}
136
��
��static-Initialisator
public class Klausurnote
{// ---
static int[] feld;
static
{feld = new int[20];
for (int i = 0; i < 20; i++)
{feld[i] = i;
}}
// ---
}
137
��
��static-Initialisator
• Beliebig viele Initialisatoren sind moglich.
• native Methoden werden typischerweisemit System.load oder System.loadLibraryin einem Initialisator geladen.
• static Methoden konnen von Erbennicht uberschrieben werden.
138
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
139
��
��Vererbung
”Ist-ein”- oder Erweiterungs- oderSubstitutions-Beziehung
Angestellter ist eine PersonDampflokomotive ist eine LokomotiveLokomotive ist ein FahrzeugGirokonto ist ein KontoQuadrat ist ein Rechteck?
140
��
��Vererbung
• Erweiterung oder Spezialisierung:Erzeugung neuer Typen durch Anfugen vonzusatzlichen Eigenschaften an alte Typen(Angestellter – Person)
• Reduktion auf Gemeinsamkeiten oder Generalisierung:Definition einer gemeinsamenSchnittstelle fur verschiedene Typen
141
��
��Syntax des Vererbungsmechanismus
public class B extends A
{// ---
}
A heißt Basisklasse, Obertyp oder Superklasse,von der B abgeleitet wird oder von der B erbt.B heißt Untertyp oder Subklasse.
142
��
��Graphische Darstellung
A
B
C
A
B
143
��
��Mehrfachvererbung nicht moglich!
A B C
D
Aber beliebig viele Schnittstellen konnen geerbt wer-den.
144
��
��final Klassen
Von einer als final deklarierten Klasse kann nicht geerbtwerden.
z.B. String, Integer, Double usw.
145
��
��Klasse Object
Object ist Basisklasse aller Klassen (außer von Object).
Die Methoden, die in Object definiert sind, konnen vonjedem Java-Objekt aufgerufen werden.
146
��
��Methoden von Object
public final Class getClass ();
public String toString ();
public boolean equals (Object obj);
protected native Object clone ()
throws CloneNotSupportedException;
protected void finalize () throws Throwable;
147
��
��Polymorphismus
Jedes Objekt einer abgeleiteten Klasse ist auch ein Objektder Basisklasse.
class B extends A {}// ---
B b = new B ();
A a = b;
148
��
��Beispiel Polymorhismus
class A
{void f (String s)
{System.out.println (s + ": f kommt von A.");
}}
class B extends A
{void f (String s)
{System.out.println (s + ": f kommt von B.");
}
void g (String s)
{System.out.println (s + ": g kommt von B.");
}}
149
��
��Beispiel Polymorphismus
public class Polymorphismus
{public static void main (String[] argument)
{A a = new A ();
B b = new B ();
a.f ("a.f ()");
a = b;
a.f ("a.f ()");
// a.g ("a.g ()"); // Fehler
b.g ("b.g ()");
}}
150
��
��mehr zur Syntax
• ”uberschreiben” und ”uberladen”
• Eine final-deklarierte Methode kann in einerabgeleiteten Klasse nicht uberschrieben werden.
• Alle static und alle private Methoden– wie auch alle Methoden einer final Klasse –sind implizit final.
• Uberschreibende Methode kann hohere Sichtbarkeit ha-ben.
151
��
��Referenz hat
• statischen Typ: Wird bei Deklaration festgelegt.
• dynamischen Typ: Wird durch das referenzierteObjekt bestimmt.
dynamic method lookup
152
��
��Uberschreiben von Variablen
class A { int z = 1; void f () {}}class B extends A { int z = 2; void f () {}}class C extends B
{int z = 3;
void f () {}
public void zugriff ()
{
153
��
��Uberschreiben von Variablen
z = 5; // z von C
f (); // f von C
this.z = 5; // z von C
this.f (); // f von C
((B) this).z = 5; // z von B
super.z = 5; // z von B
((B) this).f (); // f von C
super.f (); // f von B
((A) this).z = 5; // z von A
super.super.z = 5; // Fehler
((A) this).f (); // f von C
super.super.f (); // Fehler
}}
154
��
��Konstruktoren
class A
{private int a;
public A (int k) { a = k; }}
class B extends A
{public B ()
{super (17);
// ---
}}
155
��
��finalize
protected void finalize () throws Throwable
{// ---
super.finalize ();
}
156
��
��Reihenfolge der Initialisierung
1. Speicher fur Datenelemente aller Klassen einer Verer-bungshierarchie und Initialisierung mit Defaultwerten
2. Fur jede Klasse einer Vererbungshierarchie(beginnend mit der obersten Basisklasse)
(a) Instanzinitialisatoren
(b) Konstruktor(en)
Bemerkung: Polymorphes Verhalten der Methodenin Initialisatoren und Konstruktoren.
157
��
��Abstrakte Klassen
• Durch den Modifikator abstract wird eine Klasse abstrakt.
public abstract class AbtrakteKlasse {}
Von einer abstrakten Klasse konnen keine Objekte angelegt wer-
den.
• Durch den Modifikator abstract wird eine Methode abstrakt.
Eine abtrakte Methode hat anstatt einer Implementation ein Se-
mikolon.
public abstract void methode ();
Eine Klasse mit einer abtrakten Methode ist automatisch abstrakt
und muss auch so deklariert werden.
158
��
��Beispiel ZweiDimGebilde
public abstract class ZweiDimGebilde
{public String name;
public ZweiDimGebilde (String name)
{this.name = name;
}public abstract double flaeche ();
public abstract double umfang ();
public static void main (String[] argument)
{}
}
159
��
��Beispiel ZweiDimGebilde
public abstract class ZweiDimGebilde
{public static void main (String[] argument)
{ZweiDimGebilde[] zdg = new ZweiDimGebilde[2];
zdg[0] = new Kreis ("Rundes", 12.0);
zdg[1] = new Rechteck ("Eckiges", 17.0, 9.5);
for (int i = 0; i < zdg.length; i++)
{System.out.print (zdg[i].name + " : ");
System.out.print ("Flache = ");
System.out.print (zdg[i].flaeche ());
System.out.print (" Umfang = ");
System.out.println (zdg[i].umfang ());
}}
160
��
��Beispiel ZweiDimGebilde
class Kreis extends ZweiDimGebilde
{private double radius;
public Kreis (String name, double radius)
{super (name);
this.radius = radius;
}public double flaeche ()
{return java.lang.Math.PI * radius * radius;
}public double umfang () { return 2 * java.lang.Math.PI * radius; }}
161
��
��Beispiel ZweiDimGebilde
class Rechteck extends ZweiDimGebilde
{private double laenge;
private double breite;
public Rechteck (String name, double x, double y)
{super (name);
if (x > y) { laenge = x; breite = y; }else { laenge = y; breite = x; }}
public double flaeche () { return laenge * breite; }public double umfang () { return 2 * laenge + 2 * breite; }}
162
��
��Schnittstelle – interface
public interface DarstGebilde
{void zeige ();
}
Alle Methoden einer Schnittstelle sind implizitabstract und public.Nur Klassenkonstanten sind definierbar (static final).
163
��
��Schnittstelle – interface
<<interface>>
Schnittstelle
Klasse
164
��
��Beispiel DarstGebildeMain
public class DarstGebildeMain
{public static void main (String[] argument)
{DarstGebilde[] zdg = new DarstGebilde[2];
zdg[0] = new DarstKreis ("Rundes", 12.0);
zdg[1] = new DarstRechteck ("Eckiges", 17.0, 9.5);
for (int i = 0; i < zdg.length; i++)
{zdg[i].zeige ();
}}
}
165
��
��Beispiel DarstGebildeMain
class DarstKreis extends Kreis implements DarstGebilde
{public DarstKreis (String name, double radius)
{super (name, radius);
}
public void zeige ()
{System.out.print ("Kreis " + name + " : ");
System.out.print ("Flache = ");
System.out.print (flaeche ());
System.out.print (" Umfang = ");
System.out.println (umfang ());
}}
166
��
��Beispiel DarstGebildeMain
class DarstRechteck extends Rechteck implements DarstGebilde
{public DarstRechteck (String name, double x, double y)
{super (name, x, y);
}
public void zeige ()
{System.out.print ("Rechteck" + name + " : ");
System.out.print ("Flache = ");
System.out.print (flaeche ());
System.out.print (" Umfang = ");
System.out.println (umfang ());
}}
167
��
��Schnittstellen
• Eine Klasse, die eine Schnittstelle implementiert, mussalle Methoden der Schnittstelle implementieren.
• Eine Klasse kann beliebig viele Schnittstellenimplementieren.
• Konstanten, die in einer Schnittstelle definiert wurden,konnen in der implementierenden Klasse und derenSubklassen ohne Referenz auf den Namen der Schnitt-stelle verwendet werden.
168
��
��Sub-Schnittstellen
public interface S1 extends S01, S02, S03
{// eigene Methoden
}
Bei Schnittstellen ist Mehrfachvererbung moglich!
169
��
��Klasse java.lang.Class
Bietet Informationen uber Klassen.
Class c = Class.forName ("Klausurnote");
// oder: Class c = Klausurnote.class;
Klausurnote k = (Klausurnote)c.newInstance ();
170
��
��Beispiel fur Class
// in main:
Class c = Class.forName (argument[0]);
S s = (S) c.newInstance ();
s.zeige ();
interface S
{void zeige ();
}
class A implements S
{public void zeige ()
{System.out.println ("Es grußt Sie A!");
}}
171
��
��Implementation von clone
public class A implements Cloneable
{private int intDatenElement;
private String stringDatenElement;
private B cloneableDatenElement;
public Object clone ()
{}
}
172
��
��Implementation von clone
public Object clone ()
{A kopie = null;
try
{kopie = (A) super.clone ();
kopie.stringDatenElement = new String (stringDatenElement);
kopie.cloneableDatenElement = (B) cloneableDatenElement.clone ();
}catch (CloneNotSupportedException e)
{e.printStackTrace ();
}return kopie;
}
173
��
��”Ist-ein”-Beziehung (is-a)
B ist ein A. Alles, was fur A zutrifft, trifft auch fur B zu.Die Objekte von B sind eine Teilmenge der Objekte von A.Objekte von B konnen Objekte von A voll ersetzen(Substitutionsprinzip).
class B extends A
{//---
}
174
��
��”Ist-ein”-Beziehung (is-a)
• private Methoden von A sind Methoden, die nichtgeerbt werden.
• final Methoden von A sind Methoden, deren Schnitt-stelle und deren Implementation geerbt werden. Siekonnen nicht uberschrieben werden.
• abstract Methoden von A sind Methoden, derenSchnittstelle nur geerbt wird. Sie mussen implementiertwerden.
• Bei allen anderen Funktionen wird die Schnittstelle ge-erbt. Außerdem konnen sie neu implementiert werden.
175
��
��Beziehung ”Ist-fast-ein” (is-like-a)
Bei dieser Beziehung sollte man die Gemeinsamkeiten derPartner A und B in einer abstrakten Klasse, etwa G, zu-sammenfassen, von der A und B erben.
176
��
��Beziehung ”Ist-fast-ein” (is-like-a)
A B
G
177
��
��”Hat-ein” – Beziehung (has-a)
”Ist-implementiert-mit”-Beziehung,Layering, Containment, Embedding,Einbettung, Komponente und Komponentengruppe,”tiefe” Kopie bezuglich Komponente
class A {---}
class B
{private A a;
private A[] a = new A[10];
}
178
��
��”Benutzt-ein” – Beziehung (uses-a)
”flache” Kopie bezuglich Benutztem
class A {---}
class B
{private A a;
}
179
��
��Andere Beziehungen
• Definition einer eigenen Klasse fur die Beziehung
• Diese Klasse enthalt dann die Partner der Beziehungals Datenelemente.
• Zusatzlich konnen – aus Effizienzgrunden – Objekteoder Felder von Objekten der Beziehung in den Part-nerklassen verwaltet werden.
180
��
��Botschaften
In der Objektorientierung spielen Botschaften messagesan Objekte von anderen Objekten eine große Rolle. In Ja-va wird das Senden einer Botschaft an ein anderes Objektdadurch implementiert, dass eine Methode des die Bot-schaft empfangenden Objekts aufgerufen wird.
181
��
��Mehrfachvererbung
Java kennt keine Mehrfachvererbung. Sie kann nur so im-plementiert werden, dass hochstens eine der Basisklassengeerbt wird. Fur die anderen Basisklassen mussen Schnitt-stellen definiert werden. Die Mehrfacherbin hat von diesennicht geerbten Basisklassen je ein Datenelement und im-plementiert mit diesen Datenelementen die Schnittstellen,wobei zu empfehlen ist, dass die Basisklassen die entspre-chenden Schnittstellen auch implementieren.
182
��
��Beispiel Mehrfachvererbung
Land- raeder :int+ fahren () :void
Wasser- wasserverdr :double+ schwimmen () :void
Amphibie
183
��
��Beispiel Mehrfachvererbung
Land- raeder :int+ fahren () :void
<<interface>>
WasserSchnittstelleschwimmen () :void
Wasser- wasserverdr :double+ schwimmen () :void
Amphibie
1
184
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
185
��
��Signale
• Zeigt besondere Situation an.
• Ein Signal Werfen (throw) bedeutet, das Signal zugeben.
• Ein Signal Fangen (catch) bedeutet, die entspre-chende Ausnahmesituation zu behandeln (handle).
186
��
��Syntax
// ---
try
{// ---
throw objekt;
// ---
}catch (Typ_des_Objekts e)
{ // ---
}catch (Typ_von_anderen_Objekten e)
{ // ---
}finally
{ // ---
}// ---
187
��
��finally-Block
1. Normalerweise nach Abarbeitung des try-Blocks.
2. Nach Werfen einer Exception und Abarbeitung des catch-Blocks.
3. Nach Werfen einer Exception, fur die es hier kein catch gibt.
4. Nach einem break, continue oder return im try-Block.
• Wenn der finally-Block selbst ein throw, break, continue
oder return macht, dann wird die laufende Abbruchs-Aktion ab-
gebrochen und diese neue Abbruchs-Aktion weiterverfolgt.
188
��
��Ausnahme-Objekte
mussen von java.lang.Throwable erben.
• java.lang.Error : Diese Fehler betreffen Probleme des
Bindens im Zusammenhang mit dynamischem Laden von Code
oder Probleme der virtuellen Maschine (Speicherplatz).
• java.lang.Exception : Von diesen Fehlern kann sich ein Pro-
gramm meistens erholen (z.B. java.io.EOFException oder
java.lang.ArrayAccessOutOfBounds). Diese Klassen enthal-
ten meistens eine Diagnose-Methode und Status-Methoden oder
-Variablen, die im catch-Block verwendet werden konnen.
189
Object
Throwable
ExceptionError
RuntimeException
anormal
190
��
��Deklaration von Exceptions
void methode () throws Ausnahme1, Ausnahme2 {}
• Eine Methode muss Exceptions deklarieren, wenn sienicht von ihr behandelt werden.
• Nur ”normale” Exceptions mussen deklariert werden.”Nicht-normal” sind Error und RuntimeException
• Es genugt eine Superklasse zu deklarieren.
• Fehler- oder Ausnahmehierarchien.
191
��
��Basisklasse Throwable
• printStackTrace ()
printStackTrace (PrintWriter s)
• fillInStackTrace () :
throw e;
throw (Ausnahmetyp)(e.fillInStackTrace ());
192
��
��Best Practices
• Arbeite mit einer moglichst spezifischen Exception.
• Vermeide leere catch-Blocke.
• Javadoc kennt das @throws-Tag.
• RuntimeExceptions mussen nicht deklariert und abgefangen wer-
den. Es ist nicht Best Practice, RuntimeExceptions in einem
try-catch-Block zu behandeln. Es ist besser den Fehlerfall durch
geeigneten Code abzufangen.
• Anstatt eigene Fehlerklassen zu schreiben sollte man versuchen,
die vom JSDK zur Verfugung gestellten Klassen zu verwenden.
193
��
��Beispiel
public class Ausnahme
{public static void main (String[] argument) throws A1
{ // ---
a.f (ubergebenesIntegerargument);
}void f (int i) throws A1
{ // abhangig von i verschiedene Abbruchaktion
// Ruft evtl. auch ff (i) auf.
}void ff (int i) throws A1, A2, A4
{ // Ruft fff (i) auf.
// Behandelt einige Fehler selbst.
}void fff (int i) throws A1, A2, A3, A4, A5
{ // Wirft in Abhangigkeit von i verschiedene Fehlerobjekte.
// Behandelt einige davon.
}}
194
��
��Beispiel
class A extends Throwable
{A (String diag) { this.diag = diag; }
void diagnose ()
{Ausnahme.bem ("Ausnahme " + diag + " wurde geworfen.");
}private String diag;
}class A1 extends A { A1 () { super ("A1"); } }class A2 extends A { A2 () { super ("A2"); } }class A3 extends A
{A3 () { super ("A3"); }A3 (String diag) { super (diag); }}
class A4 extends A { A4 () { super ("A4"); } }class A31 extends A3 { A31 () { super ("A31"); } }
195
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
196
��
��Innere Klassen
• Block-Struktur und Klassen-Struktur
• Adapter-Klassen
• Syntax:
– als Klassenelement
– im Block
– anonym im Block
– static innere Klasse oder Schnittstelle
• Bezug auf außeres Objekt muss klar sein.
197
��
��Beispiel innere Klassen
public class AeussereKlasse
{public static void main (String[] argument)
{AeussereKlasse ak = new AeussereKlasse ();
ak.f ();
InnereKlasse ik = ak.new InnereKlasse ();
ik.f ();
ak.ff ();
ak.fff ();
}// ---
}
198
��
��Beispiel innere Klasse als Element
void f ()
{System.out.println ("Kommt von der außeren Klasse.");
InnereKlasse k = new InnereKlasse ();
k.f ();
}
class InnereKlasse
{void f ()
{System.out.print ("Kommt von der inneren Klasse, ");
System.out.println ("die als Element definiert ist.");
}}
199
��
��Beispiel innere Klasse im Block
void ff ()
{class InBlockKlasse
{void f ()
{System.out.print ("Kommt von der inneren Klasse, ");
System.out.println ("die im Block definiert ist.");
}}
new InBlockKlasse ().f ();
}
200
��
��Beispiel innere Klasse anonym
interface KlasseOderSchnittstelle { void f (); }
void fff ()
{(new KlasseOderSchnittstelle ()
{public void f ()
{System.out.print ("Kommt von der inneren Klasse, ");
System.out.println ("die im Block anonym definiert ist.");
}}
).f ();
}
201
��
��Schmier mit anonymen Klassen
loeschKnopf.addActionListener
(
new ActionListener ()
{public void actionPerformed (ActionEvent event)
{Graphics g = Schmier.this.getGraphics ();
Rectangle r = Schmier.this.getBounds ();
g.setColor (Schmier.this.getBackground ());
g.fillRect (r.x, r.y, r.width, r.height);
}}
);
202
��
��Callable und anonyme Klassen
package java.util.concurrent;
public interface Callable<V>
{V call () throws Exception;
}
Beispiel Rechner.java
203
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
204
��
��Scheduler
• Prioritatsgesteuertes unterbrechendes Schedulingohne Zeitscheiben.(priority based preemptive schedulingwithout time slicing)
• Abgabe des Prozessors durch yield, sleep oder wait
• Bei gleicher Prioritat nimmt Scheduler den Thread, deram langsten gewartet hat.
•Man muss aber die Gegebenheiten des zugrundeliegen-den Betriebssystems beachten: evtl. doch Zeitscheibenund weniger Prioritatsstufen.
205
��
��Erben von Thread
public class MeinThread1 extends Thread
{public void run ()
{// Eigentlicher Threadcode
}}
Anwendungscode:MeinThread1 p = new MeinThread1 ();
p.start ();
206
��
��Implementation von Runnable
public class MeinThread2 implements Runnable
{public void run ()
{// Eigentlicher Threadcode
}}
Anwendungscode:MeinThread2 ob = new MeinThread2 ();
Thread p = new Thread (ob);
p.start ();
207
��
��Beispiel ErbtThread
public class ErbtThread
{public static void main (String[] argument)
{MeinThread1 herr = new MeinThread1 ("Herr");
herr.start ();
MeinThread1 knecht = new MeinThread1 ("Knecht");
knecht.start ();
}}
208
��
��Beispiel ErbtThread
class MeinThread1 extends Thread
{private String name;
public MeinThread1 (String name) { this.name = name; }
public void run ()
{while (true)
{System.out.println ("Thread " + name + " lauft.");
yield ();
}}
}
209
��
��Beispiel ImpleRunnable
public class ImpleRunnable
{public static void main (String[] argument)
{MeinThread2 herr = new MeinThread2 ("Herr");
Thread herrTh = new Thread (herr);
herrTh.start ();
MeinThread2 knecht = new MeinThread2 ("Knecht");
Thread knechtTh = new Thread (knecht);
knechtTh.start ();
}}
210
��
��Beispiel ImpleRunnable
class MeinThread2 implements Runnable
{private String name;
public MeinThread2 (String name) { this.name = name; }
public void run ()
{while (true)
{System.out.println ("Thread " + name + " lauft.");
Thread.yield ();
}}
}
211
��
��Methoden von Thread
• start () startet Thread.
• Thread.yield () gibt Kontrolle an anderen Thread gleicher
Prioritat ab.
• Thread.sleep (long ms) oder
Thread.sleep (long ms, int nanos)
• p.join (), p.join (long ms) oder
p.join (long ms, int nanos) warten,
bis p zu Ende gekommen ist oder ein Timeout eintritt.
• interrupt () unterbricht sleep, join und wait
212
��
��Methoden von Thread
• isAlive ()
• Thread.currentThread ()
• setName (String s), getName ()
213
��
��Threadgruppen
• Jeder Thread gehort einer Threadgruppe an.
• Jede Threadgruppe außer der ”Wurzel”-Threadgruppegehort einer Threadgruppe an.
• Konstruktoren:ThreadGroup (String name)
ThreadGroup (ThreadGroup gruppe, String name)
Thread (ThreadGroup gruppe, String name)
Thread (ThreadGroup gruppe, Runnable objekt,
String name)
214
��
��GroupTree
Ubung:
GroupTree.dumpAll ()
215
��
��Prioritat
public final void setPriority (int prioritaet)
Je hoher die Zahl, desto hoher ist die Prioritat.Thread.MIN_PRIORITY bis Thread.MAX_PRIORITY.Default ist Thread.NORM_PRIORITY.
216
��
��Abbruch eines Threads?
• stop () ?
• suspend () ?
• resume () ?
217
��
��Synchronisation
• Monitorkonzept zum Schutz von ”kritischen Bereichen”. Jedes Ob-
jekt mit kritischem Bereich bekommt zur Laufzeit einen Monitor.
• Kritischer Bereich durch synchronized gekennzeichnet.
• synchronized (irgendeinObjekt) { irgendeinCode }
• synchronized (this) { Methodencode }
• synchronized (this.getClass ()) { staticMethCode }
• Lock-Implementation uber Zahler.
• Keine automatische Vererbung.
218
��
��synchronized
Mit synchronized werden Codestucke definiert,die atomar oder unteilbar bezuglich eines Objektsdurchzufuhren sind.
•Modifikator einer Methode
• synchronized (Ausdruck) Block
• synchronized (Ausdruck.getClass ()) Block
Vermeidung von Prioritatsinversion durch Prioritats-Vererbung ist fur JVM nicht verpflichtend.
219
ParkhausfreiePlatze :intlassEinfahren ()
lassAusfahren ()
status ()warte (Nachricht :String)
cstr (Kapazitat :int)main (arg :String[*])
Thread
AutoNummer :intcstr (Nummer :int, p :Parkhaus)
run ()
dreimal:
lassEinfahrenstatuswarte (...)
lassAusfahrenstatuswarte (...)
Parkhaus mitKapazitat 5erzeugen.
Zehn Autos mit
demselben
Parkhausstarten.
220
ParkhausfreiePlatze :intlassEinfahren ()
lassAusfahren ()
status ()warte (Nachricht :String)
Parkhaus (Kapazitat :int)main (arg :String[*])
Thread
AutoNummer :intAuto (Nummer :int, p :Parkhaus)
run ()
dreimal:
lassEinfahrenstatuswarte (...)
lassAusfahrenstatuswarte (...)
Parkhaus mitKapazitat 5erzeugen.
Zehn Autos mit
demselben
Parkhausstarten.
221
��
��wait, notify und notifyAll
•Methoden der Klasse Object
• Aufrufbar nur in kritischen (synchronized) Bereicheneines Objekts x.
• x.wait () :Thread kommt in wait-Warteschlange fur x.
• x.notify () :ein Thread verlasst wait-Warteschlange fur x.
• x.notifyAll () :alle Threads verlassen wait-Warteschlange fur x.
222
��
��andere Sichten
Ressourcen-Sicht:"beantrage Lock" und "gib Lock frei"
"synchronized (x) {" und "}"Ereignis-Sicht:
"warte auf Event" und "sende Event"
"x.wait ()" und "x.notify ()"
(oder "x.notifyAll ()")
223
��
��Erzeuger – Verbraucher
public class Puffer
{private boolean belegbar = true;
private Object transferObjekt;
public synchronized void legeAb (Object x)
{while (!belegbar)
{wait ();
}transferObjekt = x;
belegbar = false;
notify ();
}
224
��
��Erzeuger – Verbraucher
public synchronized Object entnehme ()
{while (belegbar)
{wait ();
}belegbar = true;
notify ();
return transferObjekt;
}
} // end class Puffer
225
��
��Erzeuger – Verbraucher
public class Erzeuger extends Thread
{private Puffer puffer;
public Erzeuger (Puffer puffer) { this.puffer = puffer; }
public void run ()
{while (true)
{Object x = new Position ();
puffer.legeAb (x);
}}
} // end class Erzeuger
226
��
��Erzeuger – Verbraucher
public class Verbraucher extends Thread
{private Puffer puffer;
public Verbraucher (Puffer puffer) { this.puffer = puffer; }
public void run ()
{while (true)
{Object x = puffer.entnehme ();
// x wird verbraucht.
}}
} // end class Verbraucher
227
��
��Erzeuger – Verbraucher
public class ErzeugerVerbraucher
{public static void main (String[] arg)
{Puffer puffer = new Puffer ();
Erzeuger erzeuger = new Erzeuger (puffer);
Verbraucher verbraucher = new Verbraucher (puffer);
erzeuger.start ();
verbraucher.start ();
}} // end class ErzeugerVerbraucher
228
��
��Erzeuger – Verbraucher
public class VieleErzeugerVerbraucher
{public static void main (String[] arg)
{Puffer puffer = new Puffer ();
for (int i = 0; i < 10; i++)
{Erzeuger erzeuger = new Erzeuger (puffer);
Verbraucher verbraucher = new Verbraucher (puffer);
erzeuger.start ();
verbraucher.start ();
}}
} // end class VieleErzeugerVerbraucher
229
��
��notify – notifyAll
Im Zweifelsfall sollte anstatt von
notify ()
notifyAll ()
verwendet werden!!!(Aber siehe ausfuhrliche Diskussion spater.)
230
��
��RingPuffer
Erzeuger
Verbraucher
XXXenqueue (X) dequeue ()
groesse - 1 0
tail head
anzahl
231
��
��Klasse RingPuffer
private Object[] f;
private int groesse;
private int anzahl = 0;
private int tail = 0;
private int head = -1;
232
��
��Konstruktor
public RingPuffer (int groesse)
{this.groesse = groesse;
f = new Object[groesse];
}
233
��
��Methode enqueue (Object ob)
synchronized public void enqueue (Object ob)
{while (anzahl >= groesse) wait ();
f[tail] = ob;
anzahl = anzahl + 1;
tail = tail + 1;
if (tail == groesse) tail = 0;
notifyAll ();
}
234
��
��Methode dequeue ()
synchronized public Object dequeue ()
{while (anzahl == 0) wait ();
anzahl = anzahl - 1;
head = head + 1;
if (head == groesse) head = 0;
notifyAll ();
return f[head];
}
235
��
��Beispiel: Emulation von Semaphoren
Semaphor
# zaehler :intcstr (:int)p ()v ()# zaehlHoch ()# zaehlRunter ()
AllgemeinerSemaphor
# zaehlHoch ()# zaehlRunter ()
BinaererSemaphor
cstr (:boolean)# zaehlHoch ()# zaehlRunter ()
236
��
��Beispiel: Emulation von Semaphoren
public abstract class Semaphor
{public Semaphor (int zaehler) { ... }
public synchronized void p () { ... }public synchronized void v () { ... }
protected int zaehler;
protected abstract void zaehlHoch ();
protected abstract void zaehlRunter ();
}
237
��
��Beispiel: Emulation von Semaphoren
public abstract class Semaphor
{public Semaphor (int zaehler)
{if (zaehler < 0) this.zaehler = 0;
else this.zaehler = zaehler;
}
238
��
��Beispiel: Emulation von Semaphoren
public synchronized void p ()
{while (zaehler == 0)
{try { wait (); } catch (InterruptedException e) {}}
zaehlRunter ();
}public synchronized void v ()
{zaehlHoch ();
notify ();
}
239
��
��Beispiel: SchweissRoboter
// ArmThread
public void run ()
{while (true)
{r.uB ();
r.s1.p ();
r.kP ();
r.s2.v ();
}}
|
|
|
|
|
|
|
|
|
|
|
// SchweissThread
public void run ()
{while (true)
{r.uV ();
r.s2.p ();
r.kS ();
r.s1.v ();
}}
240
��
��Damonen
• Lauft immer im Hintergrund.
• Java-Interpreter wird verlassen, wenn alle Threads, dienicht Damonen sind, aufgehort haben zu laufen.
• setDaemon (boolean x) (vor Thread-Start) undisDaemon ()
• Sparsame Verwendung sei empfohlen.
241
��
��Thread Safety
Thread-Sicherheit bedeutet, dass die Datenelemente einesObjekts oder einer Klasse immer einen korrekten oder kon-sistenten Zustand haben aus der Sicht anderer Objekteoder Klassen, auch wenn von mehreren Threads gleichzei-tig zugegriffen wird.
242
��
��Thread Safety
Was kann man tun? Drei Moglichkeiten:
1. Kritische Bereiche erhalten ein synchronized.
2. Die Datenelemente werden unveranderbar (final) ge-macht (immutable objects).
3. Man benutzt einen Thread-sicheren Wrapper.
243
��
��Kritische Bereiche
synchronized ist notwendig, wenn mehrere Threads auf gemeinsame
Daten (Objekte) zugreifen und mindestens ein Thread diese Daten
(Objekte) verandert. Alle Methoden, die auf die Daten (Objekte)
zugreifen, mussen als synchronized deklariert werden unabhangig
davon, ob nur gelesen oder auch verandert wird.
Methoden-Aufrufe anderer Objekte sollten nicht in einer
synchronized Umgebung erfolgen.
244
��
��Thread Safety
Warum nicht alles einfach synchronized?
1. Synchronisierte Methoden-Aufrufe sind etwa 5 mallangsamer als nicht-synchronisierte Aufrufe.
2. Unnotige Synchronisationen (etwa bei Lesezugriffen)haben uberflussiges Blockieren von Threads zur Folge.
3. Immer besteht die Gefahr eines Deadlocks.
4. Ein Codestuck mit mehreren synchronisierten Aufrufenist trotzdem nicht Thread-sicher.
245
��
��Thread Safety
if (!vector.contains (element))
{vector.add (element);
}
246
��
��Thread Safety
synchronized (vector)
{if (!vector.contains (element))
{vector.add (element);
}}
247
��
��volatile Variable
Wenn es nur darum geht, Variable fur andere Threadssichtbar zu machen (und nicht um Atomizitat) (se-quential consistency), dann kann– als mildere Form der Synchronisation –die Variable als volatile deklariert werden.
248
��
��final Variable
Alle Datenelemente sollten final deklariert werden, es seidenn, dass sie veranderlich sein sollen.
Achtung: final Referenzen!
249
��
��Entwurfs-Regeln
Wenn durch einen Methodenaufruf der Zustand eines Objekts
verandert wird und diese Anderung nur erfolgen darf, wenn eine
gewisse Wartebedingung nicht mehr vorliegt, dann hat diese
Methode folgende Form:
synchronized void methode ()
{while (Wartebedingung)
{wait ();
}// Mach Zustandsanderung.
}
250
��
��Entwurfs-Regeln
Wenn eine Zustandsanderung dazu fuhrt, dass eventuell wartende
Threads weiterlaufen konnen, muss ein notify oder allgemeiner ein
notifyAll gegeben werden:
synchronized void methode ()
{// Mach Zustandsanderung.
notifyAll ();
}
251
��
��Entwurfs-Regeln
synchronized void methode ()
{while (Wartebedingung)
{wait ();
}
// Mach Zustandsanderung.
notifyAll ();
}
252
��
��Entwurfs-Regeln
Nach rein lesenden Zugriffen muss grundsatzlichkein Thread geweckt werden (also kein notify odernotifyAll).
253
��
��Spurious Wakeup
254
��
��Timeout
Timeout ”0” bedeutet ”kein Timeout”, also unendlichlanges Warten.
Timeout-Flag.
255
��
��Zusammenfassung wait, notify, notifyAll
1. wait, notify, notifyAll in Sync
2. while (Wartebedingung) wait ();
3. Sync muss notify oder notifyAll haben, wenn es mindestens
ein wait gibt und wenn das Sync die Wartebedingung eines
waits moglicherweise false macht.
4. Ein notify genugt, wenn die Anwendung so ist, dass hochstens
ein Thread die wait-Warteschlange verlassen soll.
5. In allen anderen Fallen: notifyAll
256
��
��notify oder interrupt ?
x.notify () gibt irgendeinen Thread aus der wait-Warteschlange fur x
frei.
t.interrupt () gibt genau den Thread t aus einer wait-Warteschlange frei.
x.notify () kann nur in einer bezuglich x synchronized Umgebungaufgerufen werden. Abgesehen davon, dass man einen Monitor-Kontextbraucht, ist notify performanter als interrupt, da keine Exception geworfenwird.
notify ”verpufft” wirkungslos, wenn sich kein Thread in der wait-Warteschlange befindet.interrupt ”verpufft” nicht.
t.interrupt weckt einen Thread t auch aus einem sleep oder join.Bei t.interrupt wird eine InterruptedException geworfen.
257
��
��Verklemmungen
Vorranggraph:
T1 T2
T3
T4
T5
T6
258
��
��Verklemmungen: Strategien
• Voranforderungsstrategie
• Anforderung nach einer vorgegebenen Reihenfolge
• Anforderung von Betriebsmitteln mit Bedarfsanalyse
259
Verklemmung von Zugen
260
��
��Entwurfs-Regeln: Prioritat
Faustregeln:
• Prio (kleine Prozesszeit) > Prio (große Pro-zesszeit)
• Prio (I/O-intensiv) > Prio (rechen-intensiv)
Grundsatz:
• Korrektheit unabhangig von Prioritat!
261
��
��Entwurfs-Regeln: Prioritat
Prioritat Thread-Typ
10 Krisen-Management7 – 9 interaktiv, ereignisgesteuert4 – 6 I/O-abhangig2 – 3 Berechnung im Hintergrund
1 wenn wirklich nichts anderes ansteht
262
��
��Kapselung durch Komposition
public class MeinThread
{private Thread task;
MeinThread ()
{task = new Thread (new MeinRunnable ());
task.start ();
}private class MeinRunnable implements Runnable
{public void run ()
{// ...
}}
}
263
��
��Komposition kompakter
public class MeinThread
{MeinThread ()
{new Thread
(
new Runnable ()
{public void run ()
{// ...
}}
).start ();
}}
264
��
��Vorzeitige Objekt-Veroffentlichung
Wenn ein Objekt innerhalb seines Konstruktors irgend-wo veroffentlicht wird (z.B. durch Registrierung des Ob-jekts oder durch Starten eines Threads, der das Objektbenutzt), dann kann es passieren, dass das Objekt benutztwird, ehe es vollstandig konstruiert ist.
265
��
��Vorzeitige Objekt-VeroffentlichungAbhilfe:
class Klasse extends Thread
{protected String a;
protected Klasse () { a = "SuperKlasse"; }
protected Klasse publish ()
{start (); // Starte als Thread oder registriere irgendwo
return this;
}
public static Klasse newInstance ()
{return new Klasse ().publish ();
}// ...
266
��
��Zeitliche Auflosung
void Thread.sleep (long ms)
void thr.join (long ms)
void ob.wait (long ms)
long System.currentTimeMillis ()
long System.nanoTime ()
267
��
��JVMPI
Java Virtual Machine Profile Interface
268
��
��Adhoc-Thread
//... sequentiell
//... nun adhoc-Thread:
new Thread ()
{public void run ()
{//... paralleler Code
}}.start ();
//... ab jetzt zwei Threads
269
��
��Thread-sichere API-Klassen
Thread-sicher:java.util.Vector
java.util.Hashtable
Nicht Thread-sicher:java.util.ArrayList
java.util.HashMap
java.util.Collections.synchronizedList (List<E> x)
270
��
��Timer, TimerTask
public class Timer
{public Timer (String name, boolean isDaemon);
public void cancel (); // Beendet den Timer.
// Eingeplante Tasks werden ausgeplant.
public int purge (); // Entfernt alle ausgeplanten TimerTasks.
public void schedule (TimerTask task, Date time);
public void schedule (TimerTask task, Date firstTime, long period);
public void schedule (TimerTask task, long delay);
public void schedule (TimerTask task, long delay, long period);
public void scheduleAtFixedRate (TimerTask task,
Date firstTime, long period);
public void scheduleAtFixedRate (TimerTask task,
long delay, long period);
}
271
��
��TimerTask
public abstract class TimerTask implements Runnable
{public TimerTask ();
public boolean cancel (); // Task wird ausgeplant.
// Wenn die Task gerade lauft,
// lauft sie zu Ende.
public abstract void run ();
public long scheduledExecutionTime ();
}
272
��
��Thread-Pools
Vermeidung des Thread-Start-OverheadsBegrenzung der Anzahl der Threads
public interface Executor
{void execute (Runnable task);
}
273
��
��Thread-Pools
ThreadPoolExecutor bietet viele Moglichkeiten.
Bequem:
ExecutorService es
= Executors.newFixedThreadPool (int anz);
274
public class Task
implements Runnable
{private String name;
private int wartezeit;
public Task (String name, int wartezeit)
{this.name = name;
this.wartezeit = wartezeit;
}
public void run ()
{System.out.println ("Task " + name + " beginnt um "
+ System.currentTimeMillis () + ".");
try
{Thread.sleep (wartezeit);
}catch (InterruptedException e ) {}
System.out.println ("Task " + name + " ist fertig um "
+ System.currentTimeMillis () + ".");
}}
275
import java.util.concurrent.*;
public class ExecuteTask
{public static void main (String[] arg)
{ExecutorService executor
= Executors.newFixedThreadPool (3);
// Wir erzeugen einen Thread-Pool mit 3 Threads.
int sumWartezeit = 1000;
// Wir summieren alle Wartezeiten, damit wir
// wissen, wann wir den executor schließen konnen.
java.util.Random zufall = new java.util.Random ();
for (int i = 0; i < 10; i++)
{String name = "" + i;
int wartezeit = zufall.nextInt (1000);
sumWartezeit = sumWartezeit + wartezeit;
Runnable task = new Task (name, wartezeit);
// Tasks werden erzeugt
System.out.println ("Task " + name +
" mit Wartezeit " + wartezeit
+ " wird an den Threadpool ubergeben.");
executor.execute (task);
// Tasks werden dem Executor ubergeben.
}
try
{Thread.sleep (sumWartezeit);
executor.shutdown ();
executor.awaitTermination (sumWartezeit,
TimeUnit.MILLISECONDS);
}catch (InterruptedException e) {}
}}
276
Task 0 mit Wartezeit 406 wird hinzugefugt.
Task 1 mit Wartezeit 935 wird hinzugefugt.
Task 2 mit Wartezeit 247 wird hinzugefugt.
Task 3 mit Wartezeit 993 wird hinzugefugt.
Task 4 mit Wartezeit 402 wird hinzugefugt.
Task 5 mit Wartezeit 839 wird hinzugefugt.
Task 6 mit Wartezeit 14 wird hinzugefugt.
Task 7 mit Wartezeit 131 wird hinzugefugt.
Task 8 mit Wartezeit 613 wird hinzugefugt.
Task 9 mit Wartezeit 229 wird hinzugefugt.
Task 0 beginnt um 1103561602040.
Task 1 beginnt um 1103561602040.
Task 2 beginnt um 1103561602040.
Task 2 ist fertig um 1103561602280.
Task 3 beginnt um 1103561602280.
Task 0 ist fertig um 1103561602441.
Task 4 beginnt um 1103561602441.
Task 4 ist fertig um 1103561602841.
Task 5 beginnt um 1103561602841.
Task 1 ist fertig um 1103561602971.
Task 6 beginnt um 1103561602971.
Task 6 ist fertig um 1103561602981.
Task 7 beginnt um 1103561602981.
Task 7 ist fertig um 1103561603122.
Task 8 beginnt um 1103561603122.
Task 3 ist fertig um 1103561603272.
Task 9 beginnt um 1103561603272.
Task 9 ist fertig um 1103561603502.
Task 5 ist fertig um 1103561603682.
Task 8 ist fertig um 1103561603732.
277
��
��java.util.concurrent.Semaphore
Semaphore (int permits)
Semaphore (int permits, boolean fair)
278
��
��java.util.concurrent.Semaphore
void acquire ()
void acquire (int permits)
void acquireUninterruptibly ()
void acquireUninterruptibly (int permits)
279
��
��java.util.concurrent.Semaphore
boolean tryAcquire ()
boolean tryAcquire (int permits)
boolean tryAcquire (long timeout, TimeUnit unit)
boolean tryAcquire (int permits, long timeout,
TimeUnit unit)
280
��
��java.util.concurrent.Semaphore
void release ()
281
��
��java.util.concurrent.Semaphore
Beispiel Postschalter
282
��
��java.util.concurrent.locks.Lock
Lock s = ...;
s.lock ();
try
{// Verwendung des geschutzten
// Betriebsmittels
}finally
{s.unlock ();
}
283
Lock s = ...;
try
{s.lockInterruptibly ();
try
{// Verwendung des geschutzten Betriebsmittels
}finally
{s.unlock ();
}}catch (InterruptedException e)
{System.err.println ("Thread bekam interrupt.");
}
284
Lock s = ...;
if (s.tryLock (200, TimeUnit.MILLISECONDS))
{try
{// Verwendung des geschutzten Betriebsmittels
}finally
{s.unlock ();
}}
else
{// Tu was anderes ...
}
285
��
��Interface Lock
public Interface Lock
{void lock ();
void lockInterruptibly () throws InterruptedException;
Condition newCondition ();
boolean tryLock ();
boolean tryLock (long time, TimeUnit unit);
void unlock ();
}
286
��
��Lock wird realisiert von:
• ReentrantLock• ReentrantReadWriteLock.ReadLock• ReentrantReadWriteLock.WriteLock
287
��
��java.util.concurrent.locks.Lock
ReadWriteLock rwl
= new ReentrantReadWriteLock ();
Lock readLock = rwl.readLock ();
Lock writeLock = rwl.writeLock ();
288
��
��java.util.concurrent.locks.Lock
Kompatibilitats-Matrix:
readLock writeLock
readLock ja neinwriteLock nein nein
289
��
��newCondition
Lock s = new ...
Condition c = s.newCondition ();
s.lock ();
try
{// ...
c.await ();
// ...
c.signal ();
// ...
c.signalAll ();
// ...
}finally { s.unlock (); }
290
��
��CyclicBarrier
CyclicBarrier (int parties)
CyclicBarrier (int parties,
Runnable barrierAction)
291
��
��CyclicBarrier
void await ()
void await (long timeout, TimeUnit unit)
292
barrierAction
Task 1run
{barrier.await ()}
Task 2run
{barrier.await ()}
Task 3run
{barrier.await ()}
Task 1continue
Task 2continue
Task 3continue
293
��
��CyclicBarrier
Beispiel: Roboter-Achsen
294
��
��CountDownLatch
CountDownLatch (int count)
void await ()
void await (long timeout, TimeUnit unit)
void countDown ()
int getCount ()
295
T1run
{await}
T2run
{await}
T3run
{await}
T4run
{count-down}
T5run
{count-down}
T1cont.
T2cont.
T3cont.
T4cont.
T5cont.
296
��
��CountDownLatch
Beispiel: Arbeiter und Chef
297
��
��Exchanger<V>
Exchanger<V> exch = new Exchanger<V> ();
Task 1 Task 2
// ... | // ...
// ... | V v2 = ...
V v1 = ... | // ...
v1 = exch.exchange (v1); | v2 = exch.exchange (v2);
// v1 ist nun das v2 | // v2 ist nun das v1
// von rechts. | // von links.
298
Task 1run
{v1 = exch.
exchange (v1)}
Task 2run
{v2 = exch.
exchange (v2)}
Task 1continue
Task 2continue
v1 v2
v1v2
299
��
��Exchanger<V>
Beispiel: Tonerkassette
300
FutureTask<Result>
:FutureTask
client
<<create>>
start ()
get () :Result
301
FutureTask<Result>
:FutureTask
client
<<create>>
start ()
get () :Result
302
��
��FutureTask<Result>
public class Vorausberechnung
{public Resultat berechne () { ... return aResultat; }public FutureTask<Resultat> future
= new FutureTask<Resultat>
(
new Callable<Resultat> ()
{public Resultat call ()
{return berechne ();
}}
);
303
��
��FutureTask<Result>
public static void main (String[] arg)
{Vorausberechnung vb = new Vorausberechnung ();
new Thread (vb.future).start ();
// ...
// Tut Dinge, fur die das Resultat noch nicht benotigt wird.
// ...
Resultat r = vb.future.get ();
}}
304
��
��Interface java.util.Queue<E>
public interface Queue<E>
{boolean add (E e) throws IllegalStateException;
E element () throws NoSuchElementException;
boolean offer (E e);
E peek ();
E poll ();
E remove () throws NoSuchElementException;
}
305
��
��Interface BlockingQueue<E>
package java.util.concurrent;
public interface BlockingQueue<E>
{boolean offer (E e, long time, TimeUnit unit);
void put (E e);
E poll (long time, TimeUnit unit);
E take ();
// und weitere Methoden
}
306
��
��Queues
Schnittstelle BlockingQueue
ArrayBlockingQueue
DelayQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronousQueue
307
��
��ArrayBlockingQueue<E>
public ArrayBlockingQueue<E> (int capacity)
public ArrayBlockingQueue<E> (int capacity,
boolean fair)
public void clear ()
308
��
��Atomare Variable
package java.util.concurrent.atomic;
AtomicInteger
AtomicLong
AtomicReference<V>
...
309
��
��Atomare Variable
int addAndGet (int delta)
int getAndAdd (int delta)
int decrementAndGet ()
int getAndDecrement ()
int incrementAndGet ()
int getAndIncrement ()
int getAndSet (int newValue)
boolean compareAndSet (int expect, int update)
310
��
��Thread-sichere Collections
List<E> liste
= Collections.synchronizedList (
new ArrayList<E> ());
Map<K, E> map
= Collections.synchronizedMap (
new HashMap<K, E> ());
311
��
��Schwach Thread-sichere Collections
ConcurrentHashMap
Thread-sicher:get, put, containsKey, remove, putIfAbsent, replace
Nicht Thread-sicher:size, isEmpty
lock striping
312
��
��Schwach Thread-sichere Collections
CopyOnWriteArrayList
CopyOnWriteArraySet
313
��
��GUI-Frameworks
• single-threaded:event dispatch threadProblem: responsivenessDaher schnelle Ereignisbehandlung oderAuslagerung in eigene Thread.
•Multithreaded Frameworks hatten immer Probleme mitgegenseitigem Ausschluss und Deadlocks.
314
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
315
��
��Ein- und Ausgabestrome
• Abstrakte Stream-Basis-Klassen:InputStream bzw. OutputStream
•Methode close ()
• Reziproke read- und write-Methoden
316
��
��Klasse InputStream
• int read ()
• int read (byte[] b)
• int read (byte[] b, int von, int anz)
• Alle read-Methoden warten (block), bis ihre Einlese-forderung befriedigt ist oder das Ende des Stroms er-reicht ist.
• int available ()
• skip (long n)
• Objekt System.in ist Standard-Eingabe.
317
��
��Klasse OutputStream
• void write (int b) Schreibt ein Byte!
• void write (byte[] b)
• void write (byte[] b, int von, int anz)
• Alle write-Methoden warten (block) bis alles ge-schrieben ist.
• void flush ()
318
��
��ByteArrayInputStream
byte[] feld = new byte[256];
// fulle feld mit sinnvollen Daten
ByteArrayInputStream s1
= new ByteArrayInputStream (feld);
// oder
InputStream s2
= new ByteArrayInputStream (feld, 47, 127);
• reset ()
319
��
��ByteArrayOutputStream
• ByteArrayOutputStream ()
• ByteArrayOutputStream (int groesse)
• reset ()
• int size () Gibt Anzahl der geschriebenen Bytes.
• public synchronized byte[] toByteArray ()
• public String toString ()
• public String toString (int oberesByte)
320
��
��Datei-Strome
• FileInputStream (String dateiname)
• FileInputStream (File datei)
• FileInputStream (FileDescriptor fd)
• FileOutputStream hat entsprechende Konstruktoren.
• FileDescriptor getFD ()
321
��
��Filter-Klassen
• FilterInputStream (InputStream s)
• FilterOutputStream (OutputStream s)
•Methoden emulieren ubergebene Stream-Klassen.
• Subklassen konnen Methoden sinnvoll uberschreiben.
322
��
��Beispiel
1. Filter, das jedes Leerzeichen durch ein ”e” ersetzt.
2. Filter, das jedes ”e” entfernt.
323
��
��Beispiel
public static void main (String[] argument)
{String text = "Das Wetter ist heute besonders schon.";
byte[] feld = new byte[text.length ()];
for (int i = 0; i < feld.length; i++)
feld[i] = (byte)text.charAt (i);
InputStream s = new ByteArrayInputStream (feld); gibStreamAus (s);
InputStream s1 = new FilterBlankZuKleinE (s); gibStreamAus (s1);
InputStream s2 = new FilterEntferntKleinE (s); gibStreamAus (s2);
InputStream s3 = new FilterBlankZuKleinE (s2); gibStreamAus (s3);
InputStream s4 = new FilterEntferntKleinE (s1); gibStreamAus (s4);
}
324
��
��Beispiel
class FilterBlankZuKleinE extends FilterInputStream
{public FilterBlankZuKleinE (InputStream s)
{super (s);
}
public int read () throws IOException
{int c = super.read ();
if (c == ’ ’) return ’e’;
else return c;
}}
325
��
��Beispiel
class FilterEntferntKleinE extends FilterInputStream
{public FilterEntferntKleinE (InputStream s)
{super (s);
}
public int read () throws IOException
{int c = super.read ();
while (c == ’e’) c = super.read ();
return c;
}}
326
��
��Resultat Beispiel
Das Wetter ist heute besonders schon.
DaseWettereisteheuteebesonderseschon.
Das Wttr ist hut bsondrs schon.
DaseWttreistehutebsondrseschon.
DasWttristhutbsondrsschon.
327
��
��Gepufferte Strome
public BufferedInputStream (InputStream s);
public BufferedInputStream (InputStream s, int groesse);
public BufferedOutputStream (OutputStream s);
public BufferedOutputStream (OutputStream s, int groesse);
• erben von den entsprechenden Filterstromen
• public synchronized void mark (int leseGrenze)
• public synchronized void reset () throws IOException
328
��
��Data-Strome
• DataInputStream• DataOutputStream• implementieren SchnittstelleDataInput bzw. DataOutput
•Methoden zur Ein- bzw. Ausgabe der Bit-Sequenzen(d.h. keine formatierte oder textuelle Ausgabe als Zei-chenkette) von Standardtypen
• Lesemethoden werfen EOFException, wenn das Datei-ende erreicht ist.
329
��
��Beispiel
try
{while (true)
{int i = s.readInt ();
// verarbeite i
}}
catch (EOFException e)
{// Stream-Ende wurde erreicht. Da muss man nichts tun.
}catch (IOException e)
{// Eingabefehler ist aufgetreten. Da muss man irgendetwas machen.
}
330
��
��Pipe-Verbindung
PipedInputStream ein;
PipedOutputStream aus;
aus = new PipedOutputStream ();
ein = new PipedInputStream ();
aus.connect (ein);
oder
PipedInputStream ein = new PipedInputStream ();
PipedOutputStream aus = new PipedOutputStream (ein);
oder umgekehrt.
331
��
��Konkatenierung von Streams
public SequenceInputStream (InputStream a, InputStream b);public SequenceInputStream (Enumeration e);
InputStream s1, s2, s3;
Vector v = new Vector ();
v.addElement (s1);
v.addElement (s2);
v.addElement (s3);
InputStream s = new SequenceInputStream (v.elements ());
332
��
��Klasse RandomAccessFile
• implementiert DataInput und DataOutput
• Konstruktoren:public RandomAccessFile (String dateiname, String modus);
public RandomAccessFile (File datei, String modus);
• modus kann entweder "r" oder "rw" sein.
• public long length () Lange der Datei
• public void seek (long pos) Positionierung desLese- oder Schreibzeigers.
333
��
��Klasse File
Objekte der Klasse File reprasentieren Dateien oderVerzeichnisse. Es werden die typischen Betriebssystem-Funktionen eines Datei-Managers als Methoden zurVerfugung gestellt.
334
��
��char-Streams
Reader Writer
BufferedReader BufferedWriter
LineNumberReader
CharArrayReader CharArrayWriter
InputStreamReader OutputStreamWriter
FileReader FileWriter
FilterReader FilterWriter
PushbackReader
PipedReader PipedWriter
StringReader StringWriter
PrintWriter
335
��
��BufferedReader
Eine sehr nutzliche Methode von BufferedReader ist:
public String readLine () throws IOException;
336
��
��PrintStream und PrintWriter
• Textuelle Ausgabe von Standard- und Referenztypen.
• PrintWriter ist vorzuziehen.
• print () und println ()
•Methode toString () wird dabei verwendet.
• Objekte System.out und System.err
sind PrintStreams.
337
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
338
��
��Klasse URL
•Uniform Resource Locator
• URL url = new URL (urlAdresse);
• urlAdresse = file:/var/home/kfg/dy.java
oderurlAdresse = http://www.ba-stuttgart.de/~kfg/dy.java
• (String)(url.getContent ())
• c.createImage ((ImageProducer)(url.getContent ()))
• InputStream ein = url.openStream ();
339
��
��Klasse URLconnection
• URLconnection uc = url.openConnection ();
• InputStream ein = uc.getInputStream ();
• OutputStream aus = uc.getOutputStream ();
• Ermittlung von Datei-Informationen
340
��
��Datagramme
•UDP – universal datagram protocol
• Klassen DatagramPacket und DatagramSocket
• Senden:
InetAddress adr = InetAddress.getByName (argument[0]);
DatagramPacket paket = new DatagramPacket
(botschaft, botschaft.length, adr, port);
DatagramSocket socket = new DatagramSocket ();
socket.send (paket);
341
��
��Datagramme
• Empfangen:byte[] botschaft = new byte[256];
DatagramPacket paket = new DatagramPacket
(botschaft, botschaft.length);
DatagramSocket socket = new DatagramSocket (port);
socket.receive (paket);
342
��
��Client/Server
• Fur eine zuverlassige (TCP – reliable) Verbindung zwischen
Client und Server wird die Klasse Socket verwendet.
• Objekte der Klasse ServerSocket warten auf Verbindungsan-
forderungen und liefern im Falle einer Verbindung neue Socket-
Objekte zur Kommunikation mit dem Client.
• Der Server ist multithreaded.
• Der Client erzeugt einen Socket:
Socket s = new Socket (adresse, port);
InputStream ein = s.getInputStream ();
OutputStream aus = s.getOutputStream ();
343
��
��Klasse Dienst
public class Dienst extends Thread
{public static void main (String[] argument)
{int lokalerPort = Integer.parseInt (argument[0]);
new Dienst (lokalerPort);
}
protected ServerSocket dienstSocket;
344
��
��Klasse Dienst
public Dienst (int lokalerPort)
{dienstSocket = new ServerSocket (lokalerPort);
this.start ();
}
public void run ()
{while (true)
{Socket kundenSocket = dienstSocket.accept ();
Verbindung v = new Verbindung (kundenSocket);
}}
}
345
��
��Klasse Verbindung
class Verbindung extends Thread
{protected Socket kundenSocket;
protected BufferedReader ein;
protected PrintWriter aus;
public Verbindung (Socket kundenSocket)
{this.kundenSocket = kundenSocket;
ein = new BufferedReader (new InputStreamReader (
kundenSocket.getInputStream ()));
aus = new PrintWriter (new OutputStreamWriter (
kundenSocket.getOutputStream ()));
this.start ();
}
346
��
��Klasse Verbindung
public void run ()
{String zeile;
while ((zeile = ein.readLine ()) != null)
{aus.print ("Naturlich ");
aus.println (zeile.replace (’?’, ’.’));
aus.flush ();
if (zeile.equals ("quit")) break;
}}
}
347
��
��Klasse Kunde
public class Kunde
{public static void main (String[] argument)
{int entfernterPort = Integer.parseInt (argument[1]);
Socket s = new Socket (argument[0], entfernterPort);
BufferedReader sein =
new BufferedReader (
new InputStreamReader (s.getInputStream ()));
PrintWriter saus =
new PrintWriter (
new OutputStreamWriter (s.getOutputStream ()));
BufferedReader eingabe =
new BufferedReader (
new InputStreamReader (System.in));
348
��
��Klasse Kunde
while (true)
{System.out.println ("Eingabe der Frage:");
System.out.print ("> ");
System.out.flush ();
String frage = eingabe.readLine ();
saus.println (frage); saus.flush ();
System.out.println ("Antwort:");
String antwort = sein.readLine ();
if (antwort == null) break;
System.out.println (antwort);
if (frage.equals ("quit")) break;
}}
}
349
��
��Klasse KundeApplet
public class KundeApplet extends Applet
implements ActionListener
{int entfernterPort = DEFAULTPORT;
PrintWriter saus;
BufferedReader sein;
Socket s;
TextField textFeld;
TextArea textBereich;
Empfaenger empfaenger;
350
��
��Klasse KundeApplet
public void init ()
{entfernterPort = Integer.parseInt (
getParameter ("Port"));
s = new Socket (this.getCodeBase ().getHost (),
entfernterPort);
sein = new BufferedReader (
new InputStreamReader (s.getInputStream ()));
saus = new PrintWriter (
new OutputStreamWriter (s.getOutputStream ()));
351
��
��Klasse KundeApplet
this.setLayout (new BorderLayout ());
Panel panel = new Panel ();
Label eingabe = new Label ("Eingabe der Frage: ", Label.LEFT);
panel.add (eingabe);
textFeld = new TextField (40);
textFeld.addActionListener (this);
panel.add (textFeld);
this.add ("North", panel);
textBereich = new TextArea ();
this.add ("Center", textBereich);
empfaenger = new Empfaenger (this, sein, textBereich);
}
352
��
��Klasse KundeApplet
public void actionPerformed (ActionEvent e)
{if (e.getSource () == textFeld)
{saus.println (e.getActionCommand ()); saus.flush ();
textFeld.setText ("");
}}
}
353
��
��Klasse Empfaenger
class Empfaenger extends Thread
{Applet applet;
BufferedReader ein;
TextArea aus;
public Empfaenger (Applet applet, BufferedReader sein,
TextArea textBereich)
{this.applet = applet;
ein = sein;
aus = textBereich;
this.start ();
}
354
��
��Klasse Empfaenger
public void run ()
{String zeile;
while ((zeile = ein.readLine ()) != null)
{aus.setText (zeile);
if (zeile.endsWith ("quit"))
{applet.stop ();
return;
}}
}}
355
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische Benutzeroberflachen
Vererbung AppletsAusnahmebehandlung Datenbankanbindung
356
��
��AWT und Swing
• Swing ist Teil von JFC.
• Swing baut auf AWT auf.
• Swing benutzt MVC-Design.
• Swing ist flexibler, großer, protabler als AWT.
• Swing ist schneller und weniger Speicher-intensiv alsAWT.
• Swing-Komponenten beginnen mit J.
357
��
��Graphische Benutzeroberflachen
•Komponenten (component) JComponent
• Behalter (container) Container
• Hierarchie: Behalter ist auch Komponente.
• Anordnung mit Layout-Managern
• Anwendungsprogramme gehen von JFrame,
• Applets erben JApplet .
358
��
��Layout-Manager von AWT
• FlowLayout• GridLayout• GridBagLayout• BorderLayout• CardLayout• Setzen eines Layout-Managers mit MethodesetLayout (new FlowLayout ());
359
��
��Layout-Manager von Swing
• BoxLayout• OverlayLayout• ScrollPaneLayout• ViewportLayout
360
��
��FlowLayout
• Anordnung zeilenweise
• Default zentriert
• Bundigkeit:FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER
• Konstruktor:FlowLayout (
Bundigkeit, Horizontal-, Vertikalabstand)
361
��
��GridLayout
• Konstruktor:GridLayout (
Zeilen, Spalten, Horizontal-, Vertikalabstand)
362
��
��BorderLayout
NORTH
WEST CENTER EAST
SOUTH
• Konstruktor: BorderLayout (Horizontal-, Vertikalabstand)
• add (new JButton ("Nord"), BorderLayout.NORTH);
363
��
��CardLayout
JPanel karten = new JPanel ();
CardLayout kartenLayout = new CardLayout ();
karten.setLayout (kartenLayout);
JPanel karte1 = new JPanel ();
String nameKarte1 = "Knopfe";
// Fulle karte1 mit Knopfen oder ahnlichem
karten.add (nameKarte1, karte1);
JPanel karte2 = new JPanel ();
String nameKarte2 = "Textfelder";
// Fulle karte2 mit Textfeldern oder ahnlichem
karten.add (nameKarte2, karte2);
364
��
��CardLayout
kartenLayout.first (karten);
kartenLayout.next (karten);
kartenLayout.previous (karten);
kartenLayout.last (karten);
kartenLayout.show (karten, nameKarte2);
365
��
��GridBagLayout
• Zeilen und Spalten
• Komponenten konnen mehrere Zeilen und Spaltenbeanspruchen.
• Zellen gewichtet
• Spezifikation mit GridBagConstraints-Objekt
366
��
��Vorgehensweise GridBagLayout
JPanel sack = new JPanel ();
sack.setLayout (new GridBagLayout ());
GridBagConstraints c = new GridBagConstraints ();
// Fur jede Komponente komponente, die zum JPanel sack addiert wird,
// werden die Parameter des GridBagConstraints c gesetzt.
// z.B.
c.gridx = 3;
c.gridy = 4;
// usw
sack.add (komponente, c);
367
��
��GridBagConstraints
gridx, gridy: Spezifikation der Spalten und Zeilennummer der Zelle begin-nend bei 0 oder RELATIVE (bezuglich zuletzt addierter Komponente).
gridwidth, gridheight: Anzahl Spalten und Zeilen, die die Zelle einnimmt.
fill: Angabe der Art, wie die Komponente die Zelle ausfullen soll (NONE(Default), HORIZONTAL, VERTICAL, BOTH).
ipadx, ipady: Die Minimalgroße der Komponente wird um 2 * ipadx bzw2 * ipady Pixel vergroßert.
insets: Spezifikation des externen Padding durch Angabe eines Insets-Objekt.
anchor: Spezifikation des Ortes innerhalb der Zelle (CENTER (Default), NORTH,NORTHEAST usw).
weightx, weighty: Mit den Gewichten zwischen 0.0 (Default!) und 1.0 wirdspezifiziert, wie ubriger Platz verteilt wird.
368
��
��Klasse Insets
public class meinBehaelter extends JPanel
{// ...
public Insets getInsets ()
{return new Insets (17, 8, 20, 5);
// oben, links, unten, rechts
}// ...
}
369
��
��Koordinaten von Komponenten
void setBounds (int x, int y, int breite, int hoehe)
void setBounds (Rectangle r)
void setLocation (int x, int y)
void setLocation (Point p)
void setSize (int breite, int hoehe)
void setSize (Dimension d)
Dimension getScreenSize ()
int getScreenResolution ()
Toolkit.getDefaultToolkit ()
370
��
��Java-Bean
Jede Swing-Komponente ist ein Java-Bean.Z.B. Klasseneigenschaft background:
background {Color, get, set, Color.black}
Der Defaultwert ist Color.blackund es gibt die Methoden:
public Color getBackground ()
public void setBackground (Color farbe)
371
��
��Klassenhierarchie
Toplevel-KlassenObject
(Component)
(Container)
Panel
Applet
JApplet
Window
JWindow
Frame
JFrame
Dialog
JDialog
372
��
��Klassenhierarchie
Komponenten-KlassenObject
(Component)
(Container)
(JComponent)
JComboBox
JLabel
JList
JMenuBar
JPanel
JPopupMenu
JScrollBar
JScrollPane
373
��
��Klassenhierarchie
Komponenten-Klassen(JComponent)
JTable
JTree
JInternalFrame
JOptionPane
JProgressBar
JRootPane
JSeparator
JSlider
JSplitPane
JTabbedPane
374
��
��Klassenhierarchie
Komponenten-Klassen(JComponent)
JToolBar
JToolTip
JViewport
JColorChooser
JTextComponent
JTextArea
JTextField
JPasswordField
JEditorPane
JTextPane
JFileChooser
375
��
��Klassenhierarchie
Komponenten-Klassen(JComponent)
JLayeredPane
JDesktopPane
(AbstractButton)
JToggleButton
JCheckBox
JRadioButton
JButton
JMenuItem
JMenu
JRadioButtonMenuItem
JCheckBoxMenuItem
376
��
��Geerbte Eigenschaften
Von den AWT-Klassen werden viele Eigenschaften geerbt.Fur die Sichtbarkeit interessant sind:
• visible• showing• valid
377
��
��Toplevel-Komponenten
Toplevel-Komponenten sind JWindow, JFrame, JDialogund JApplet.JFrame jf = new JFrame ("Titel");
Container bjf = jf.getContentPane ();
bjf.add (...);
jf.setVisible (true);
jf.setVisible (false);
jf.dispose ();
378
��
��Schnittstelle RootPaneContainer
public Container getContentPane ();
public void setContentPane (Container c);
public Component getGlassPane ();
public void setGlassPane (Component c);
public JLayeredPane getLayeredPane ();
public void setLayeredPane (JLayeredPane c);
public JRootPane getRootPane ();
379
��
��Klasse JRootPane
public JMenuBar getJMenuBar ();
public void setJMenuBar (JMenuBar c);
....................................
______ ____________________________
380
��
��SwingSet
Suche SwingSet.jar undnimm es in den CLASSPATH, dann
$ java SwingSet
381
��
��Beispiel InfoDialog
public class InfoDialog extends JDialog
implements ActionListener
{private JButton knopf;
public static void main (String[] args)
{InfoDialog d = new InfoDialog (
null, "Informations-Dialog Demo",
"Das ist ein Beispiel fur eine\n" +
"graphische Benutzeroberflache.\n");
d.setVisible (true);
}
382
��
��Beispiel InfoDialog
public InfoDialog (Frame elter, String titel, String botschaft)
{super (elter, titel, false);
Container c = getContentPane ();
c.setLayout (new BorderLayout (15,15));
MehrzeilenLabel label = new MehrzeilenLabel (botschaft);
c.add (label, BorderLayout.CENTER);
knopf = new JButton ("Weg damit");
knopf.addActionListener (this);
JPanel p = new JPanel ();
p.setLayout (new FlowLayout (FlowLayout.CENTER, 15, 15));
p.add (knopf);
c.add (p, BorderLayout.SOUTH);
this.pack ();
}
383
��
��Beispiel InfoDialog
public void actionPerformed (ActionEvent e)
{if (e.getSource () == knopf)
{this.setVisible (false);
this.dispose ();
}
}
384
��
��Weiter Beispiele
• MehrzeilenLabel• JaNeinDialog• AlleKomponenten• RollbaresSchmieren• AlleEreignisse
385
��
��Ereignis-Modell
• JDK1.0: Ereignis-Modell basiert auf Vererbung.
• JDK1.1: Ereignis-Modell basiert auf Delegation.
– Es ist leicht zu lernen.
– Saubere Trennung zwischen Anwendungs- und GUI-Code.
– Robuster Ereignis-Behandlungs-Code, ”bei dem der Compiler
schon viel sieht”.
– Gestaltungsmoglichkeiten fur Ereignis-Flusse bzw -
Weiterleitung.
386
��
��Ereignis-Modell
• Ereignis-Klassen-Hierarchie beginnt bei:java.util.EventObject
• AWT-Ereignisse leiten sich ab von der Subklasse:java.awt.AWTEvent
• Source und Listener
• EventListener Schnittstelle oder
• EventListener Adapter
387
��
��Registrierung von Empfangern
Source.add<Ereignistyp>Listener
(<Ereignistyp>Listener);
Mehrere Listener sind moglich.
388
��
��Ereignis-Klassen
• Daten sind uber set- und get-Methoden zuganglich.
• Bei mehreren Listenern und set-Methode wird Ereig-nis fur jeden Listener kopiert.
• ID-Nummer sollte> java.awt.AWTEvent.RESERVED_ID_MAX sein.
389
��
��Low-Level Ereignisbehandlung
Klasse Component:
• processEvent (AWTEvent e)
• process<X>Event (AWTEvent e)
• enableEvents (long Ereignismaske)
390
��
��Ereignis-Testprogramm
public class EreignisTester extends JApplet
implements MouseListener, MouseMotionListener,
FocusListener, KeyListener
{public void init ()
{this.addMouseListener (this);
this.addMouseMotionListener (this);
this.addFocusListener (this);
this.addKeyListener (this);
}public void paint (Graphics g)
{g.drawString ("Mause und Tippe in diesem Fenster!", 20, 20);
g.drawString (botschaft, 20, 50);
}
391
��
��Ereignis-Testprogramm
public void mousePressed (MouseEvent e)
{ botschaft = modusTaste (e.getModifiers ())
+ " mousePressed wurde aufgerufen (" + e + ").";
repaint (); }public void mouseReleased (MouseEvent e) { ... }public void mouseEntered (MouseEvent e) { ... }public void mouseExited (MouseEvent e) { ... }public void mouseClicked (MouseEvent e) { ... }public void mouseDragged (MouseEvent e) { ... }public void mouseMoved (MouseEvent e) { ... }public void focusGained (FocusEvent e) { ... }public void focusLost (FocusEvent e) { ... }public void keyPressed (KeyEvent e) { ... }public void keyReleased (KeyEvent e) { ... }public void keyTyped (KeyEvent e) { ... }}
392
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
393
��
��”Hello-World”-Applet
import java.awt.*;
import javax.swing.*;
public class GutenTagApplet1 extends JApplet
{public void paint (Graphics g)
{super.paint (g);
g.drawString ("Guten Tag", 127, 47);
}}
394
��
��”Hello-World”-HTML-Datei
<APPLET code="GutenTagApplet1.class" width=500 height=300>
</APPLET>
395
��
��”Hello-World”-Applet – komplizierter
public class GutenTagApplet2 extends JApplet
{protected Font zeichenSatz;
protected int zeichenGroße = 72;
protected Color textFarbe = Color.yellow;
private int ovalx = 20;
private int ovaly = 20;
private int ovalb = 430;
private int ovalh = 200;
private int arcb = 30;
private int arch = 30;
public void init ()
{zeichenSatz = new Font ("sanscerif", Font.BOLD, zeichenGroße);
}
396
��
��”Hello-World”-Applet – komplizierter
public void paint (Graphics g)
{super.paint (g);
g.setColor (Color.blue);
g.fillRoungRect (ovalx, ovaly, ovalb, ovalh, arcb, arch);
g.setColor (Color.magenta);
for (int i = 0; i < 6; i++)
g.drawRoundRect (ovalx - i, ovaly - i,
ovalb + 2 * i, ovalh + 2 * i, arcb, arch);
g.setColor (textFarbe);
g.setFont (zeichenSatz);
g.drawString ("Guten Tag", ovalx + 25,
ovaly + ovalh / 2 + zeichenGroße / 2);
}
397
��
��Grundlagen
• Ein Applet ist eine Subklasse der Klasse JApplet.
• Der Lebenszyklus eines Applets wird durch dievier Methoden init (), start (), stop () unddestroy () bestimmt.
• repaint (), update (Graphics g)
und paint (Graphics g)
und paintComponent (Graphics g)
398
��
��Graphik-Methoden
• public void repaint ()
public void repaint (long ms)
public void repaint (int x, int y, int width, int height)
public void repaint (long ms, int x, int y, int width, int height)
•public void update (Graphics g)
{g.setColor (getBackground ());
g.fillRect (0, 0, width, height);
g.setColor (getForeground ());
paint (g);
}
• public void paint (Graphics g)
399
��
��Applet-Parameter: Methoden
• public String getParameter (String pn) :Sie gibt den Wert des Parameters mit Namen pn alsString zuruck.
• public String[][] getParameterInfo () : Web-Browsers und Applet-Viewer rufen eventuell diese Me-thode auf, um dem Benutzer die moglichen Parameteranzuzeigen.
• public String getAppletInfo () : Diese Metho-de kann von einer ”Uber”-Dialogbox verwendet werdenund sollte von jedem Applet implementiert werden.
400
��
��Beispiel Applet-Parameter
public void init ()
{String s = this.getParameter ("Zeichengroße");
try { zeichenGroße = Integer.parseInt (s); }catch (NumberFormatException e) { zeichenGroße = 72; }super.init ();
s = this.getParameter ("Textfarbe");
if (s.equals ("Gelb")) textFarbe = Color.yellow;
else if (s.equals ("Rot")) textFarbe = Color.red;
// ---
401
��
��HTML-Datei
<APPLET code="GutenTagApplet3"
width=500 height=300>
<PARAM name="Zeichengroße" value="36">
<PARAM name="Textfarbe" value="Grun">
</APPLET>
402
��
��APPLET-tag-Attribute
codebase
code, object
archive
width, heigth
alt
name
align
vspace, hspace
403
��
��Ausschnitt Thread Bewegung
weiter: while (true)
{// ---
while (angehalten)
{try
{sleep (10000);
}catch (InterruptedException e)
{angehalten = false;
}}
if (beendet) break weiter;
// ---
404
��
��Ausschnitt Applet Aktiv
public void init ()
{bewegung = new Bewegung ();
bewegung.start ();
bewegung.angehalten = true;
}
public void start ()
{bewegung.angehalten = false;
bewegung.beendet = false;
bewegung.interrupt ();
}
405
��
��Ausschnitt Applet Aktiv
public void stop ()
{bewegung.angehalten = true;
}
public void destroy ()
{bewegung.beendet = true;
bewegung.interrupt ();
bewegung.join ();
}
406
��
��Ausschnitt Applet Aktiv
public void paint (Graphics g)
{super.paint (g);
for (int i = 0; i < kreise.size (); i++)
{((Oval) kreise.get (i)).male (g);
}}
407
��
��Inhalt Intensivkurs Java
Einleitung Innere KlassenDatentypen ThreadsOperatoren StreamsKontrollstrukturen Netzwerk-ProgrammierungDie Java-Klasse Graphische BenutzeroberflachenVererbung AppletsAusnahmebehandlung Datenbankanbindung
408
��
��JDBC und weiter
• JDBC ist ein low-level API → high-level APIMan kann damit SQL-Anweisungen absetzen.
• embedded SQL fur Java
• direkte Abbildung von Tabellen als Java-Klassen(object/relational mapping)
• JDBC, ODBC, ADO.NET
• einstufige, zweistufige Modelle
409
��
��JDBC-Treiber
• Treiber: Klasse Driver
• Treiber: http://java.sun.com/products/jdbc
• DriverManager.getConnection ()
410
��
��JDBC-URL
• Standard-Syntax: jdbc:<Subprotokoll>:<Subname>Beispiel: jdbc:postgres://ba-stuttgart.de:47/spielbank
• Registrierung von Subprotokollen:Email an jdbc@wombat.eng.sun.com
• ODBC:jdbc:odbc:<Datenquellname>[;<Attributname>=<Attributwert>]*
jdbc:odbc:Spielbank;UID=kfg;PWD=Ratatui;CacheSize=20;
411
��
��Treiber laden:
• Class.forName ("TreiberKlassenname");
• Class.forName ("TreiberKlassenname")
.newInstance ();
• System-Eigenschaft jdbc.drivers
412
��
��Verbinding Connection
Class.forName ("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://nr5:3306/it96";
Connection verbindung
= DriverManager.getConnection (
url, "Bozo", "hochgeheim");
413
��
��Klassen fur SQL-Anweisungen
• Statement• PreparedStatement• CallableStatement
414
��
��Klasse Statement
Statement anweisung = verbindung.createStatement ();
ResultSet ergebnis
= anweisung.executeQuery ("SELECT a, b, c FROM tabelle");
while (ergebnis.next ())
{int x = ergebnis.getInt ("a");
String y = ergebnis.getString ("b");
float z = ergebnis.getFloat ("c");
// Tu was mit x, y, z ...
}ergebnis.close ();
anweisung.close ();
verbindung.close ();
415
��
��execute...
• executeQuery (String sql)
• executeUpdate (String sql)
• execute (String sql)
416
��
��Klasse ResultSet
get<Typ> ("Spaltenname")-Methodenoderget<Typ> (Spaltennummer)-Methoden
ergebnis.next ()
Benannte Kursoren und positionierte Manipulationen sindauch moglich.
417
��
��Beliebig lange Datenelemente
SQL: LONGVARBINARY oder LONGVARCHARkann als Stream gelesen werden.
InputStream ein1 = ergebnis.getBinaryStream (spaltennummer);
InputStream ein2 = ergebnis.getAsciiStream (spaltennummer);
Reader ein3 = ergebnis.getUnicodeStream (spaltennummer);
418
��
��Klasse PreparedStatement
PreparedStatement prepAnw
= verbindung.prepareStatement (
"UPDATE SP SET QTY = ? WHERE SNR = ?");
set<Typ> (parameternummer, parameterWert)
Z.B.:
prepAnw.setInt (1, 37);
prepAnw.setString (2, "S3");
execute (), executeQuery (), executeUpdate ()
419
��
��Klasse CallableStatement
CallableStatement prozAnw = verbindung.prepareCall (
"{call prozedurName (?, ?)}");prozAnw.setInt (1, 25);
prozAnw.registerOutParameter (1, java.sql.Types.INTEGER);
prozAnw.registerOutParameter (2, java.sql.Types.DECIMAL, 3);
ResultSet rs = prozAnw.executeQuery ();
// Verarbeite rs
int i = prozAnw.getInt (1);
java.math.BigDecimal d = prozAnw.getBigDecimal (2, 3);
420
��
��Transaktionen
• Transaktionen beziehen sich auf die Verbindung(Connection)
• setAutoCommit (boolean)
• commit ()
• rollback ()
• setTransactionIsolation (int)
421
��
��Objekt-Serialisierung
• Kodierung von Objekten in Byte-Strome
• Kodierung von Byte-Stromen in Objekte
• kompletter Objektgraph
• Serializable oder Externalizable
422
��
��Default-Serialisierung
•Marker-Schnittstelle Serializable
Klasse java.io.ObjectOutputStream :
public final void writeObject (Object ob)
throws IOException;
Klasse java.io.ObjectInputStream :
public final Object readObject ()
throws OptionalDataException, ClassNotFoundException,
IOException;
423
��
��Default-Serialisierung
• Rekursiver Aufruf von writeObject bzw readObject
zur Serialisierung bzw Deserialisierungdes ganzen Objekt-Graphen
• Zirkel werden erkannt.
• Superklassen werden serialisiert.
• Felder sind auch serialisierbar.
• transient-Klassenelemente werden nicht serialisiert.
424
��
��Beispiel
public class ProgrammiererIn extends Person
implements Serializable
{// - Konstruktor, zeige, setLaune, setKollegIn
private Sprache sprache;
private transient String laune;
private ProgrammiererIn kollegIn;
}
425
��
��Beispiel
class Person implements Serializable
{public Person (String name) { this.name = name; }protected String name;
}
class Sprache implements Serializable
{public Sprache (String name) { this.name = name; }String name;
}
426
��
��Beispiel Serialisierung
public class Serialisierung
{public static void main (String[] argument) throws IOException
{FileOutputStream f = new FileOutputStream (argument[0]);
ObjectOutputStream s = new ObjectOutputStream (f);
ProgrammiererIn p1 = new ProgrammiererIn ("Gustav", "Java");
ProgrammiererIn p2 = new ProgrammiererIn ("Hanna", "C++");
p1.setLaune ("schlechte"); p2.setLaune ("gute");
p1.setKollegIn (p2); p2.setKollegIn (p1);
p1.zeige (); p2.zeige ();
s.writeObject (p1); s.writeObject (p2);
427
��
��Beispiel Serialisierung
ProgrammiererIn[] fp = new ProgrammiererIn[20];
for (int i = 0; i < 20; i++)
{fp[i] = new ProgrammiererIn ("Dummy" + i, "Cobol");
fp[i].setKollegIn (p1);
}s.writeObject (fp);
s.close ();
f.close ();
}}
428
��
��Beispiel Deserialisierung
public class Deserialisierung
{public static void main (String[] argument)
throws IOException, ClassNotFoundException
{FileInputStream f = new FileInputStream (argument[0]);
ObjectInputStream s = new ObjectInputStream (f);
ProgrammiererIn p;
p = (ProgrammiererIn)s.readObject (); p.zeige ();
p = (ProgrammiererIn)s.readObject (); p.zeige ();
ProgrammiererIn[] fp = (ProgrammiererIn[])s.readObject ();
for (int i = 0; i < 20; i++) fp[i].zeige ();
s.close (); f.close ();
}}
429
��
��Vor- und Nachbehandlung
private void writeObject (ObjectOutputStream aus)
throws IOException
{// Vorbehandlung des Objekts
aus.defaultWriteObject ();
// Nachbehandlung des Objekts
}
430
��
��Nachbehandlung
private void readObject (ObjectInputStream ein)
throws IOException, ClassNotFoundException
{ein.defaultReadObject ();
// Nachbehandlung des Objekts
}
431
��
��Beispiel
• Name wird in * eingebettet.
• writeObjekt muß in Superklasse Person definiertwerden.
• Laune wird nach dem Lesen auf ”unbestimmte” gesetzt.
• Anwendungsprogramme andern sich nicht.
432
��
��Eigene Serialisierung
• Implementiere Schnittstelle Externalizable
public void writeExternal (ObjectOutput aus)
throws IOException;
public void readExternal (ObjectInput ein)
throws IOException, ClassNotFoundException;
433
��
��Beispiel
public void writeExternal (ObjectOutput aus)
throws IOException
{String old = name;
name = "*" + name + "*";
super.writeExternal (aus);
aus.writeObject (sprache);
aus.writeObject (kollegIn);
name = old;
}
434
��
��Beispiel
public void readExternal (ObjectInput ein)
throws IOException, ClassNotFoundException
{super.readExternal (ein);
sprache = (Sprache)ein.readObject ();
kollegIn = (ProgrammiererIn)ein.readObject ();
setLaune ("unbestimmte");
}
435
��
��Klassenversion
• Entweder Definition vonstatic final long serialVersionUID
= -7440944271964977635L;
• oder automatische Vergabe.
• serialver
436
��
��Applet
• <APPLET>-Tag hat ein Attribut OBJECTzum Laden serialisierter Applet-Objekte.
• Initialisierungs-Code wird nicht mehr benotigt.
• Konvention: Objekt-Datei hat Erweiterung .ser
• appletviewer kann zur Erzeugung vonObjekt-Dateien verwendet werden (Stop, Save).
437
top related