GhK FB 17 Mathematik / Informatik Programmieren mit Java Was ist JAVA? Arbeitsweise, Programmstruktur GhK Java-Referenzen FB 17 Mathematik / Informatik • http://www.ora.com/info/java/ (Verlagsseite O‘Reilly) • http://www.javasoft.com/ (Sun Microsystems Java-Seite) • David Flanagan : JAVA in a nutshell (deutsch), O‘Reilly, 1996 • Martin Schrader, Lars Schmidt-Thieme : Java, eine Einführung, Springer 1997 GhK Eigenschaften von Java FB 17 Mathematik / Informatik • einfach – nur kontrollierte Sprünge (kein goto) – modularer Aufbau – keine Zeiger • interpretiert – – – – Übersetzung in Java-Bytecode interpretiert durch ava- irtualportabel (plattformunabhängig) gute Performance , sparsam ust n ime compilierung achine • robust – – – – für technische Anwendungen kozipiert stark typisiert Ausnahmenbehandlung Sicherheit • Objekt-orientiert • Multithread-fähig GhK Java-Umgebung FB 17 Mathematik / Informatik Texteditor Compiler (javadoc) .java-Datei Compiler (javac) Applet Interpreter (appletviewer) Applikation JVM (java) Interpreter .class-Datei .html-Datei Browser (netscape) Interpreter GhK elementare Programmstruktur FB 17 Mathematik / Informatik • Programme (Java-Klassen) public class <NameDerKlasse> { public static void main (String args[]) { .......... } } • Applets import java.applet.*; import java.awt.*; Programmdatei : <NameDerKlasse>.java public class <NameDerKlasse> { public static void main (String args[]) { .......... } } public class <NameDerKlasse> extends Applet { public void init () { .......... } public void paint (Graphics <NameDesGraphikobjekts>) { .......... } } GhK Kommentare FB 17 Mathematik / Informatik • von entscheidender Wichtigkeit bei jedem Programmieren sind die Kommentare, ohne die ein Programm weder lesbar noch wartbar ist: – Was tut dieser Programmabschnitt? – Welche Rolle spielt diese Variable – Welche Bedingungen sind an diese Parameter geknüpft • Java kennt 3 sorten von Kommentarklammern – // ........ Zeilenende kurze Anmerkungen – /* ........ */ Kommentare über mehrere Zeilen – /** ........ */ Kommentare, die zur Dokumentation verwendet werden GhK Beispiel: Zaehler FB 17 Mathematik / Informatik // Zaehler.java class Zaehler { // Variablen private int wert; //Zählerstand //Methoden int wert() {return wert;} //Zählerstand ablesen void wert(int i) {wert = i;} //Zähler setzen void inkrement() {++wert;} // weiterzählen void dekrement() {--wert;} // zurückzählen } GhK Beispiel ZählerTest FB 17 Mathematik / Informatik //ZaehlerTest.java import java.io.* ; //in/output class ZaehlerTest { public static void main(String[] args) { Zaehler z = new Zaehler(); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); // in liest von der Tastatur PrintWriter out = new PrintWriter(System.out, true); // out schreibt auf den Bildschirm for(;;) { //Endlosschleife out.println("----\nZählerstand: " + z.wert() + "\n----"); char akt = '+' ; // char-Variable deklariert do { out.print("Aktion(+/-): "); out.flush(); try { akt = in.readLine().charAt(0); } catch(IOException ioe){} } while (akt != '+' && akt != '-'); if (akt ='+') z.inkrement(); else z.dekrement(); } //Ende for-Schleife } //Ende main } //Ende ZaehlerTest GhK Ausgabe ZaehlerTest FB 17 Mathematik / Informatik ❚ GhK Beispiel Zählerframe FB 17 Mathematik / Informatik //ZaehlerFrame.java import java.awt.* ; //Fenstertechnik import java.awt.event.* ; //Mausaktionen class ZaehlerFrame extends Frame {private Button plus, minus; private TextField stand; private Zaehler z; ZaehlerFrame(String s) {super(s); z = new Zaehler(); setLayout(new GridLayout(2,2)); add(new Label("Zählerstand: ", Label.RIGHT) add(stand = new TextField(10)); stand.setText(String.valueOf(z.wert())); stand.setEditable(false); add(plus = new Button("Inkrementiere")); add(minus = new Button("Dekrementiere")); ButtonListener check = new ButtonListener(); plus.addActionListener(check); minus.addActionListener(check); pack(); setVisible(true); } //Ende Konstruktor public static void main(String[] args) { new ZaehlerFrame("Zähler-Test") } //Ende main class ButtonListener implements ActionListener {public void actionperformed(ActionEvent e) {if (e.getAction.command().equals("Inkrementiere")) z.inkrement(); else z.dekrement(); stand.setText(String.valueOf(z.wert())); } //Endeactinperformed } //Ende ButtonListener } //Ende ZaehlerFrame GhK Beispiel Zählerapplet FB 17 Mathematik / Informatik //ZaehlerApplet.java import java.applet.* ; //Applet import java.awt.* ; //Fenstertechnik import java.awt.event.* ; //Mausaktionen public class ZaehlerAplett extends Applet {private Button plus, minus; private TextField stand; private Zaehler z; public void init() {z = new Zaehler(); setLayout(new GridLayout(2,2)); add(new Label("Zählerstand: ", Label.RIGHT) add(stand = new TextField(10)); stand.setText(String.valueOf(z.wert())); stand.setEditable(false); add(plus = new Button("Inkrementiere")); add(minus = new Button("Dekrementiere")); ButtonListener check = new ButtonListener(); plus.addActionListener(check); minus.addActionListener(check); // pack(); setVisible(true); } //Ende init GhK FB 17 Mathematik / Informatik public static void main(String[] args) { new ZaehlerFrame("Zähler-Test") } //Ende main class ButtonListener implements ActionListener {public void actionperformed(ActionEvent e) {if (e.getAction.command().equals("Inkrementiere")) z.inkrement(); else z.dekrement(); stand.setText(String.valueOf(z.wert())); } //Endeactinperformed } //Ende ButtonListener } //Ende ZaehlerFrame HTML-Seite: ... <applet code = ZaehlerApplet width = 250 height = 70> ZählerApplet GhK Bezeichner FB 17 Mathematik / Informatik • Alle in einem Java Programm verwendeten Variablen, Funktionen etc. tragen Namen (Bezeichner), die nach folgenden Regeln gebildet werden: – Sie beginnen mit einem Buchstaben a..z,A..Z oder _,$. – die nachfolgenden Zeichen dürfen außerdem auch Zahlen oder andere druckbare Zeichen des Unicode-Zeichensatzes (eine 16-Bit Obermenge des ASCII-Zeichensatzes) sein. • Java ist case-sensitiv, d.h. es unterscheidet zwischen Groß- und Kleinschreibung. – Er, eR, ER, er sind jeweils verschiedene Bezeichner. • Die Verwendung von _ und $ am Bezeichneranfang ist nicht zu empfehlen, weil die meisten Programmierer sie für Systemvariablen halten werden. GhK elementare Datentypen FB 17 Mathematik / Informatik • Java kennt 8 vordefinierte Datentypen Datentyp Größe(Bit) default Wert boolean 8 false byte 8 0 char 16 short Min Max -128 127 \u0000 \u0000 \uFFFF 16 0 -32768 32767 int 32 0 -2147483648 2147483647 long 64 0 -9223372036854775808 9223372036854775808 float 32 0.0F ±3.40282347E+38 double 64 0.0D ±1.79769313486231570E+308 ±4.94065645841246544E-324 ±1.40239846E-45 GhK Typ boolean FB 17 Mathematik / Informatik • boolean Werte sind keine Zahlwerte, sondern können nur die Werte true und false annehmen. • Operationen auf boolean: ! & ^ | ?: && || == != logische Negation logisches AND logisches XOR logisches OR logisches IF short circuit AND short circuit OR gleich ungleich GhK (einstellig) (zweistellig) (zweistellig) (zweistellig) (dreistellig) (zweistellig) (zweistellig) (zweistellig) (zweistellig) x !x x&y x^y x|y x?y:z x==y x!=y false true false y y z !y y true false y !y true y y !y short circuit Auswertung FB 17 Mathematik / Informatik • Die Operationen && sowie || unterscheiden sich in ihrer Ausgabe auf boolean nicht von & und |, jedoch im „Verhalten“. • Ist x&&y bzw. x||y auszuwerten, so wird zunächst x berechnet. Wertet x zu 0 bzw. 1 aus, so ist dies bereits die Ausgabe, ohne daß y noch ausgewertet werden muß. • Der Sinn ist nicht nur eine Verringerung des Aufwandes, sondern auch die Vermeidung von Sonderfällen. Beispiel: (x==0)||(y/x<=100) (x==0)|(y/x<=100) liefert immer einen boolesches Ergebnis, wogegen für x==0 eine Division durch 0 veranlassen würde. GhK Integer-Typen FB 17 Mathematik / Informatik • In Java gibt es keine gesonderten vorzeichenlosen ganzen Zahlen, sondern alle 4 Zahlbereiche byte, short, int, long haben auch negative Werte. • Literale (Zeichendarstellung von Werten) – Die Zahlen dürfen mit einem Vorzeichen +,- oder mit 0, 0X oder 0x beginnen. – Nun kommt eine Folge von Ziffern, die nicht mit 0 beginnt – Ist der Anfang 0, besteht die Folge nur aus Oktalziffern 0,..,7 oder ist leer; die Zahl wird als Oktalzahl interpretiert. – Ist der Anfang 0x oder 0X, können auch die hexadezimalziffern A,..,F bzw. a,..,f in der Folge auftreten; die Zahl wird als Hexadezimalzahl interpretiert. – alle übrigen Zahlen werden als Dezimalzahlen interpretiert – 255, 0377, 0xff, 0xFF, 0XFF haben den gleichen Wert. GhK Integer-Operationen FB 17 Mathematik / Informatik • einstellig ++ -+, ~ Inkrement Dekrement Vorzeichen bitweises Komplement x+1 x-1 x , -x x XOR FF..F • zweistellig +, *, /, % <<, >> >>> &, ^, | plus, minus mal, geteilt, Rest Shift links, rechts Shift rechts mit 0-Erweiterung bitweises AND, XOR, OR • boolean-wertig ==, != <, <=, >,>= ?: gleich, ungleich Größenvergleich dreistelliges IF (b)?x:y = “falls b, dann x sonst y“ GhK Seiteneffekte von ++ und -- FB 17 Mathematik / Informatik • Normalerweise erwartet man von einer Operation, daß sie Eingaben entgegennimmt und eine Ausgabe abliefert, aber die Eingaben unverändert läßt, ++ und -- sind anders! • ++x und --x erhöhen oder erniedrigen den Wert von x um 1 und liefern dann diesen veränderten Wert von x ab. • x++ und x-- liefern zuerst den Wert von x ab und erhöhen oder erniederigen danach den Wert von x • Beispiel: hat x den Wert 5 , so ist die Wirkung von: y=++x y=x++ y=--x y=x-x: 6 6 4 4 y: 6 5 4 5 • Man nennt ein solches Verhalten einer Funktion einen Seiteneffekt. GhK char-Typ FB 17 Mathematik / Informatik • Der typ char kann beliebige unicode-Zeichen enthalten • Literale (werden in Hochkommata ‘ ‘ oder “ “ eingeschlossen ): –alle druckbaren Ascii-Zeichen außer ‘ “ und \ . –Die Escape-Sequenzen: \n (neue Zeile) \t (tabulator) \b (Rückschritt) \r (Rücklauf) \f (neue Seite) \‘ ( Hochkomma) \“ (Quotation) \\ (Backslash) –Unicode-Zeichen : \uxxxx dabei ist xxxx eine Folge von 1 bis 4 Hexadezimalziffern. • Beispiele ‘ ‘ Leerzeichen ‘\‘‘ Hochkomma ‘\‘ „Fehler“ ‘\u5c‘ „derselbe Fehler“ ‘\\u22‘ Backslash ‘\u3240‘ • Operationen: ==, !=, ?: GhK real-Typen FB 17 Mathematik / Informatik Gleitkommazahlen gibt es in zwei Genauigkeiten float und double, die nach IEEE Standard 754 festgelegt sind, nach diesem Standard gibt es außer den Zahlen noch : • +inf das Ergebnis + Unendlich bei einem Überlauf • -inf das Ergebnis - Unendlich bei einem Unterlauf • NaN das Ergebnis „not a number“, wenn eine Operation kein sinnvolles Ergebnis haben kann, z.B. Division durch 0 oder Wurzel aus einer negativen Zahl. Ist x = 0, +inf oder -inf, so ist NaN*x=x Achtung: Es wird nie ein Fehler "Division durch 0" moniert! GhK Operationen auf reals FB 17 Mathematik / Informatik • einstellig ++ -+, - Inkrement Dekrement Vorzeichen x+1 x-1 x , -x • zweistellig +, *, / plus, minus mal, geteilt • boolean-wertig = =, != <, <=, >,>= ?: gleich, ungleich Größenvergleich dreistelliges IF (b)?x:y = “falls b, dann x sonst y“ GhK real Literale FB 17 Mathematik / Informatik • Die Gleitkommazahlen haben die Literaldarstellung: Vorzeichen Ziffernfolge Ziffernfolge Exponent Endung dabei sind • Vorzeichen : | optional • Exponent : | Vorzeichen Ziffernfolge optional | | | optional • Endung : wenn ein Exponent vorkommt, ist auch der Dezimalpunkt optional. • Die Zahl 256.0172 hat also z.B. folgende Darstellungen: 2560172E-4D, .2560172e3, 2.560172e2f, ... GhK Zeichenketten FB 17 Mathematik / Informatik • Ein besonderer Datentyp in Java ist der String , der eine Folge von unicode-Zeichen darstellt. • Literale: Wie bei char werden Einzelzeichen und escapesequenzen in Folge notiert und die Folge in Hochkommata eingeschlossen. • Beispiele: “Ausgabe:\n“ , ‘dies ist ein langer String‘, ““ • Operationen: + (Conkatenation) ‘Milch‘+‘Mann‘ steht für ‘MilchMann‘ = =, != (Identität, Vorsicht!!) length( ) (Länge) length(‘der Hund ist tot.\n‘) ist 18 charAt( ) , equals( ) , compareTo( ) , IndexOf( ) , ... GhK Referenztyp String FB 17 Mathematik / Informatik • String ist kein elementarer Typ, obwohl er praktisch wie ein elementarer Typ behandelt wird. • Elementare Daten haben einen Speicherplatz fester Größe, in dem ihr Wert abgespeichert ist. Auch Strings haben einen Speicherplatz fester Größe, in dem steht aber nur eine Referenz (Verweis, Zeiger) auf den Speicherplatz, wo die Zeichenfolge abgelegt ist. • == und != fragen ab, ob zwei Strings auf denselben Speicherplatz verweisen. x!=y besagt also nicht notwendig, daß die Zeichenreihen verschieden sind, sondern lediglich, daß sie an unterschiedlichen Stellen abgelegt sind. Ob zwei Strings dieselbe Zeichenreihe sind, wird mit equals( ) überprüft. • Java achtet darauf , daß gleichlautende String Konstanten nicht mehrmals an verschiedenen Stellen abgelegt werden. GhK Spezielle Strings FB 17 Mathematik / Informatik • null ist kein String, sondern allgemein ein leerer Zeiger, wo mal ein Verweis (z.B. auf einen String) hinein kann. • ‘‘ (bzw. ““) ist der leere String, d.h. der einzige String von Länge 0. • ‘ ‘(bzw. “ “) ist der String der Länge 1, der als einziges Zeichen das Leerzeichen (space) enthält. • In String-literalen können alle Zeichen wie bei char verwendet werden: – alle druckbaren Ascii-Zeichen außer ‘ “ und \ . – Die Escape-Sequenzen: \n (neue Zeile) \t (tabulator) \b (Rückschritt) \r (Rücklauf) \f (neue Seite) \‘ ( Hochkomma) \“ (Quotation) \\ (Backslash) – Unicode-Zeichen : \uxxxx dabei ist xxxx eine Folge von 1 bis 4 Hexadezimalziffern. • Strings sind im Wesentlichen unveränderlich. Eine Veränderung einer String-Variable kann nur dadurch erzeugt werden, daß man einen neuen String des gewünschten Inhalts erzeugt und dann die Variable darauf verweisen läßt. GhK Java hat keine Zeiger FB 17 Mathematik / Informatik Die Behauptung, Java habe keine Zeiger, ist in gewissem Sinn zwar richtig, aber im Grunde genommen völlig falsch. • Andere Programmiersprachen haben Zeiger, das sind Speicheradressen, die der Programmierer manipulieren kann. Letzteres geht in Java tatsächlich nicht. • Alle Datentypen (= Klassen) in Java, außer den elementaren Typen sind Referenztypen, also Zeiger auf eine entsprechend große Speicherstelle. In diesem Sinne ist Java ohne Zeiger also nicht denkbar. Der Unterschied zu anderen Programmiersprachen ist, daß die Speicherverwaltung aus Sicherheitsgründen jedem programmierten Zugriff entzogen ist. Alles was ein Java-Programm tun kann, ist Speicher anfordern und die zugeteilte Adresse im Zeiger ablegen. GhK Felder (Arrays) FB 17 Mathematik / Informatik • Felder (arrays) sind Folgen von Daten, die alle denselben Typ T besitzen, das Feld wird dann mit T[] deklariert. String ist so ähnlich wie ein char array. • Auch Felder sind Referenztypen, also Zeiger auf einen Speicherbereich und werden bei der Deklaration T[] Name mit null (dem leeren Zeiger) initialisiert. • Beispiele: – int[] a; //deklariert ein int-Feld a – String[] b //deklariert ein String-Feld b – short[][] c //deklariert ein doppelt indiziertes short-Feld c GhK Erzeugen von Feldern FB 17 Mathematik / Informatik • Die Deklaration eines Referenztyps (z.B. Feld) erzeugt nur den Zeiger null, der noch auf nichts zeigt. Deshalb muß ein solcher Typ vor Gebrauch erst erzeugt werden, d.h. Speicher muß reserviert und die Adresse im Zeiger abgelegt werden. (Standardmethode new) • a = new int[5] a 0 0 0 0 0 ein Feld von 5 integers wird erzeugt und jeder Eintrag mit 0 initialisiert. • double[] d = {1.1, 1.21, 1.331}; d 1.1 1.21 1.331 ein Feld von 3 doubles wird deklariert, erzeugt und mit den angegebenen Werten initialisiert. • b = new String[] {“Die“, “Erzeugung“, “von“, “Feldern“}; ein Feld von Strings wird deklariert, erzeugt und mit den angegebenen Werten initialisiert. die Erzeugung von Feldern b GhK Zugriff auf Felder FB 17 Mathematik / Informatik • Der Inhalt von Feldkomponenten kann angesprochen werden (zum Lesen oder zum Schreiben), indem man den Feldnamen A und in eckigen Klammern [] die Position i anspricht : A[i] • Die Positionen beginnen mit 0 und gehen bis length(A)-1 • Beispiel: int[] x = new int[n] //auch for (int i=0; i<n; i++) x[i]=i*i Variable n ist zulässig GhK Speicherverwaltung FB 17 Mathematik / Informatik • Aus Sicherheitsgründen übernimmt Java vollständig die Speicherverwaltung. • new : Der Nutzer (Programmierer) hat nur die Möglichkeit Speicherplatz für einen bestimmten Datentyp anzufordern. Die Speicheradresse (Zeiger) wird dann unter dem Namen des Datenelementes abgelegt. • elementar : Bei elementaren Datentypen wird für jedes Datenelement direkt der Wert (kein Zeiger) unter dem Namen abgelegt. • garbage collection: Wird ein Speicherbereich von seinem Programm nicht mehr referenziert, gibt Java selbständig den Speicherplatz wieder frei.