3 Sprachelemente und Anweisungen Grundgerüst eines Java - Programms: /* Datei A.java */ package ein.package; import import // optional // beliebig viele ,import'-Referenzen: B; // B.class java.util.Vector; // Vector.class // genau eine ,public'-Klasse: public class A { float a; int f() {...} double g() {...} // // // // beliebig viele Elemente von A Variable a Methode f() Methode g() public static void main( String argv[] ) { ... } class NurlmPackageNutzbar { int f() {...} /* Ende der Datei A.java */ Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Kommentare In Java gibt es folgende Kommentartypen: // /* Zeilenweise Kommentare Beginn / Ende Kommentar einschließlich \r, \n, \r\n /** Dokumentationskommentar */ */ Zeichensätze / Unicode Java benutzt eine sogenannten Unicode mit 16 bit / Zeichen. Damit sind 65.535 unterschiedliche Zeichen codierbar. Die Java-Umgebung wandelt ASCII oder Latin-1 Dateien beim Einlesen in den Unicode um. Die allgemeine Darstellung des Unicodes lautet: \udddd Java // d = hexadezimalziffer HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Ziffern in Unicode (Auszug) Unicode \u0030 - \u0039 \u0660 - \u0669 \u06f0 - \u06f9 \u0966 - \u096f \u09e6 - \u09ef \u0a66 - \u0a6f \u0ae6 - \u0aef \u0b66 - \u0b6f Beschreibung ISO-Latin-1 (und ASCII)-Ziffern Arabisch-IndischeZiffern Ost-Arabisch-Indische Ziffern DewanagarischeZiffern BengalischeZiffern Gurmukhi-Ziffern Gujarati-Ziffern Oriya-Ziffern .... Buchstaben und Ziffern in Unicode (Auszug) Java Unicode \u0041 - \u005A (,A'-'Z') \u0061 - \u007A (,a'-'z') \u00C0 - \u00D6 \u00D8 - \u00F6 \u00F8 - \u00FF \u0100 - \u1FFF Beschreibung ISO-Latin-I (+ ASCII) lateinische Großbuchstaben ISO-Latin-1(und ASCII) lateinische Kleinbuchstaben ISO-Latin-l, ergänzende Buchstaben ISO-Latin-1, ergänzende Buchstaben ISO-Latin-1, ergänzende Buchstaben Latin Erweiterung-A, HS Merseburg WS 06/07 Latin Erweiterung-B, ..... 3 Sprachelemente und Anweisungen Die Klasse Character beinhaltet einige Methoden zur Überprüfung, ob es sich um ein Zeichen oder eine Ziffer handelt: • Character.isJavaLetter() = true, wenn Zeichen Unicode–Buchstabe • Character.isJavaLetterOrDigit()= true, wenn Zeichen ein Buchstabe oder Ziffer ist Namenskonventionen Folgende Konventionen sollten bei Bezeichnern eingehalten werden: • • • • • • Java Klassen- / Schnittstellename beginnen mit Großbuchstaben Methoden- / Variablennamen beginnen mit Kleinbuchstaben Packagenamen werden klein geschrieben Konstanten alles groß Unterstriche nur für mehrteilige Konstanten Zugriffsmethoden set(X) get(X) HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Beispiel: package DE.fh-merseburg.de.informatik.javaclasses; import java.util.Date; class EineKlasseMitEinemLangenNamen { String s; double radius; double nochEinDouble; final int MAX_VALUE = 2001; double eineDoubleMethode() ... int eineIntMethode() ... void setRadius( double d ) ... double getRadius() ... } Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Literale Literale sind Quelltextdarstellung des Wertes eines primitiven Datentyps, eines Strings oder das NULL Symbol. Außer der Darstellung der Unicode Zeichen (\uxxxx) ergeben sich bei Literalen in Java keine Abweichungen zur C-Schreibweise. Schlüsselworte abstract boolean break byte case catch char dass const* continue default do Java double else extends final finally float for goto* if implements import instanceof int interface long native new null package private protected public return short HS Merseburg WS 06/07 static super switch synchronized this throw throws transient* try void volatile while 3 Sprachelemente und Anweisungen In Java werden folgende Arten von Datentypen unterschieden: Elementare Datentypen Felder Klassen Schnittstellen } Referenztypen Elementare Datentypen Java boolean für logische Werte, char für Zeichen, Integertypen byte, short, int, long Fließkommatypen float, double. HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Zugriffe auf eine Variable eines elementaren Typs liefern oder setzen immer direkt den Wert dieser Variable. Es sind keine Pointer auf Variable eines elementaren Datentyps möglich. Ebenso kann die Adresse dieser Variablen nicht ermittelt werden. Die Übergabe eines elementaren Datentyps als Argument an eine Methode erfolgt immer by-value durch Kopieren des Wertes. Referenztypen stehen für Objekte, auf die über einen Pointer (eine Referenz) zugegriffen wird. Pointer werden von Java automatisch verwaltet und können nicht modifiziert werden. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Wertebereiche, Defaultwerte und der benötigte Speicherplatz: Typ Wertebereich Default Größe byte short int long -128... 127 -32768... 32767 -2147483648... 2147483647 -9223372036854775808... 9223372036854775807 0 0 0 0L 8 bit l6 bit 32 bit 64 bit char \u0000... \uFFFF boolean false, true \u0000 false l6 bit 1 bit float +-3.40282E+38 double +- l.79769E+308 0.0F 0.0D 32 bit 64 bit Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Berechnungsgrundsätze: Der Operand des kleineren Typs wird automatisch und ohne Informationsverlust in den benötigten größeren Typ konvertiert, bevor die Operation ausgeführt wird. Eine Zuweisung an den Typ byte oder short muß immer mit einer expliziten Typkonvertierung geschrieben werden: byte int long Java b1, b2 = 42, b3 = 69; i = 2147483647, i2 = 0xfedcba98; k = 2147483648L, k2 = 0x0001000200030042L; i = b2 + b3; b1 = b2 + b3; b1 = (byte)(b2 + b3); // // // b3 = (byte) k2; // ok, liefert 0x42 HS Merseburg WS 06/07 ok. Fehler! ok. 3 Sprachelemente und Anweisungen Casting Die Typkonventierung (,,Casting") erfolgt wie in C/C++ mit: (Datentyp) Ausdruck Die Umwandlung eines kleineren in einen größeren Typ wird vom Compiler bei Bedarf automatisch in der Reihenfolge (von links nach rechts) byte short int long float double char int long float double vorgenommen. Bei Konvertierung eines größeren Typs in einen kleineren Typ (etwa von long nach int oder von short nach byte) werden nur die passenden unteren Bits kopiert und die höherwertigen Bits abgeschnitten. Diese Konvertierungen werden deshalb niemals von Java automatisch vorgenommen, sondern müssen immer mit einem Cast ausdrücklich angefordert werden. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Der Typ char char repräsentiert Unicode-Zeichen, die als vorzeichenloser 16 bit Wert gespeichert werden. Die Zeichenliterale werden in einfache Anführungszeichen geschrieben: char c1, c2, c_a, c_b, c_A; c_a = ´a´; c_b = ´b´; c_A = ´A´; c1 = ´\n´; c2 = ´\u4321´; Bei Unicode-Zeichen im Bereich unter 255, (ASCII bzw. Latin-l Zeichen) gibt es keine Unterschiede zu char in aus C. Einige Zeichen können auch über die ESC – Sequenzen erreicht werden. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Sequenz \n \t \b \r \f \\ \‘ \“ \ddd \udddd Bedeutung Zeilenvorschub (engl. new line) (\u000A) LF Tabulator (\u0009) HT Backspace (\u0008) BS (Wagen-)Rücklauf (engl. return) (\u000D) CR Seitenvorschub (engl. form feed) (\u000C) FF der inverse Schrägstrich (engl. backslash) selbst (\u005C) Apostroph (engl. single quote) (\u0027) Anführungsstriche oben (engl. double quote) (\u0022) ein durch seinen oktalen Wert angegebenes Zeichen, ein Unicode-Zeichen, wobei jedes d eine hexadezimale Ziffer ist Alle für Integertypen zulässigen Operationen können auch mit char durchgeführt werden. Die Zuweisung von char zu einem short oder byte – Typ per Typkonvertierung erfolgt durch Kopieren der Bits, wobei aus einem (zwingend positiven) char negative Werte entstehen können. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Der Typ boolean Boolean wird zur Darstellung der logischen Werte mit den Literalen false und true verwendet. Um den Mißbrauch von Integerwerten für logische Werte zu verhindern, verbietet Java Typumwandlungen zwischen den Integertypen und dem Typ boolean. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Die Fließkommatypen float und double Die Fließkommatypen float und double entsprechen dem Standard IEEE-754 für Gleitkommaarithmetik. Eine float-Variable wird intern mit 32 bit gespeichert und in der Forrn s * m * 2e dargestellt, mit der folgenden Bedeutung s: Vorzeichen +-, m: Mantisse - ein positiver Integerwert < 224 e: Exponent - Integerwert zwischen einschließlich - 149 und 104. Dies entspricht etwa dem Bereich von +-3.40 1038 mit einer Genauigkeit von 6 bis 7 Dezimalstellen. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Eine double-Variable wird in 64 bit gespeichert, wobei die Mantisse kleiner als 253 ist und der Exponent zwischen -1045 und +1000 liegt. Darstellbare double Werte liegen im Bereich von etwa +-1.798 * 10308 mit einer Genauigkeit von etwa 15 Dezimalstellen. Die Schreibweise von Fließkommazahlen entspricht den auch in C/C++ üblichen Konventionen. Literale des Typs float müssen mit einem angehängten ´F´ gekennzeichnet werden (ansonsten double-Werte). Der genaue Wert der Zahlenbereiche kann über Konstanten der Klassen java.Float bzw. java.Double (Achtung Grossschreibung) ermittelt werden. Das Resultat einer arithmetischen Operation ist nur dann vom Typ float, wenn beide Operanden vom Typ float sind oder ein Operand float und der andere Operand ein Integerwert (außer long) ist. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Fließkommaoperationen lösen in Java keine Fehlerbedingungen aus (auch nicht die Division durch Null). Falls ein Überlauf entsteht, wird dem Resultat der spezielle Wert ,,unendlich" zugewiesen: /* Werte für +/- unendlich: Float.POSITIVE_INFINITY; Float.NEGATIVE_INFINITY Double.POSITIVE_INFINITY Double.NEGATIVE_INFINITY */ float f = Float.MAX_VALUE; float g = Float.POSITIVE_INFINITY; if (f == g) ... // false! Das Ergebnis von undefinierten Operationen, z.B. beim Aufruf von Math.sqrt(-1), ist der Wert Double.NaN (,,Not-a-Number") bzw. Float.NaN. Java HS Merseburg WS 06/07 3 Sprachelemente und Anweisungen Konstanten Alle Variablen der elementaren Typen können durch das Attribut final als Konstanten markiert werden. Sehr häufig werden final-Variablen gleichzeitig als static definiert. Eine final-Variable muss natürlich sofort bei ihrer Deklaration initialisiert werden, da der Wert später nicht mehr geändert werden kann: final char MAX_VALUE = ´\uffff´; static final double PI = 3.14159265358979323846; final static int MIN_PRIORITY = 1; final static int MAX_PRIORITY = 10; Java HS Merseburg WS 06/07