Java Programmierung

Kap.2:   GRUNDTYPEN, ZEICHENKETTE (String), FORMAT

Kapitel-Index
     2.1 Abfragbare Typ-Eigenschaften, Typ-Konvertierung       
     2.2 boolean Logik       
     2.3 char Unicode-Zeichen       
     2.4 byte/short/int/long Ganzzahlen      
     2.5 float/double Gleitpunktzahlen 
     2.6 String als Referenztyp, Zeichenketten-Literale        
     2.7 Format-String
     2.8 Testfragen
  In diesem Kapitel werden Grundtypen (PrimitiveType, 2.1-5) und Zeichenketten (String, 2.6) behandelt, sowie formatierte Zeichenketten und formatierte Ausgabe mit System.out.printf(,) (2.7).
030: Type                         Typ
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
H ---> boolean ----,                                   -,        H
H  |-> char -------| -,         -,         -,           |        H
H  |-> byte -------|  |-Integral-| Integral-|           |        H
H  |-> short ------|  | NotLong- |-Type     | Numeric-  | Primi- H
H  |-> int --------| -' Type     |          |-Type      |-tive-  H
H  |-> long -------|            -'          |           | Type   H
H  |-> float ------| -, FloatingPoint-      |           |        H
H  |-> double -----| ---Type               -'          -'        H
H  |-> Boolean ----|            -,         -,          -,        H
H  |-> Character --| -, Integral-|          |           |        H
H  |-> Byte -------|  |-NotLong- |          |           |        H
H  |-> Short ------|  | ClassType| Wrapper- |           |        H
H  |-> Integer ----| -'          |-Class-   |           |        H
H  |-> Long -------|             | Type     |           |        H
H  |-> Float ------|             |          | ClassOr-  |        H
H  |-> Double -----|            -' special  | Interface-|        H
H  |-> String -----|            ---Class-   |-Type      |        H
H  |-> Throwable --|            -' Type     |           |        H
H  |-> Iterable ---|            -, special  |           | Refe-  H
H  |-> Annotation -----------,  ---Interface|           |-rence- H
H  |  ,--------------------, |     Type     |           | Type   H   
H  |->|ClassOrInterfaceType|-+-----------, -' Array-    |        H
H  |  '--------------------' |           | ---Type      |        H 
H  |  ,----------, TypeVar.  |-> [ -> ] -' -'           |        H       -'          |         H
H  |->|Identifier|-----------|   bounded   ---Type-     |        H
H  |  '----------' gen.Class-|   WildCard  -' Identifier|        H
H  |              OrInterfacev   forbidden              |        H
H  '-> no name ---------------->           ---Null-     |        H
H                  type null               -' Type     -'        H
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

2.1      Abfragbare Typ-Eigenschaften, Typ-Konvertierung

  Die Wertebereiche numerischer Typen sind abfragbar. Im folgenden Programm MinMaxValue werden die Konstanten MIN_VALUE und MAX_VALUE der numerischen Typen als Datenfelder ihrer Hüll-Klassentypen abgefragt und ausgegeben.
//*********************** MinMaxValue.java ***********************
//              MIN/MAX_VALUE fuer numerische Typen              *
//    SMALL   ist die kleinste float/double Differenz zu 0.0     *
//    EPSILON ist die kleinste float/double Differenz zu 1.0     *
//****************************************************************

class MinMaxValue 
 {public static void main(String[] args)         // args ungenutzt
   {long    n=10l;
    float  Ef=1f/n; while(1-Ef<1 && 1+Ef>1) {Ef=1f/(n*=10);}
    double Ed=1d/n; while(1-Ed<1 && 1+Ed>1) {Ed=1d/(n*=10);}
    System.out.print
     ("  char:"+(int)Character.MIN_VALUE+
        " ... "+(int)Character.MAX_VALUE+"\r\n"      
     +"  byte:"+          Byte.MIN_VALUE+
        " ... "+          Byte.MAX_VALUE+"\r\n"      
     +" short:"+         Short.MIN_VALUE+      
        " ... "+         Short.MAX_VALUE+"\r\n"      
     +"   int:"+       Integer.MIN_VALUE+       
        " ... "+       Integer.MAX_VALUE+"\r\n"      
     +"  long:"+          Long.MIN_VALUE+      
        " ... "+          Long.MAX_VALUE+"\r\n"      
     +" float:"+        -Float.MAX_VALUE+       
        " ... "+         Float.MAX_VALUE+"\r\n"      
     +"        SMALL="+  Float.MIN_VALUE+", EPSILON="+Ef*10+"\r\n"
     +"double:"+       -Double.MAX_VALUE+       
        " ... "+        Double.MAX_VALUE+"\r\n"      
     +"        SMALL="+ Double.MIN_VALUE+", EPSILON="+Ed*10+"\r\n"
     );
   }
 }
//****************************************************************
  Der Leser kann das Programm zunächst übergehen und nur die im Output aufgelisteten Wertebereiche betrachten:
| Output
+---------------------------------------------------------
|  char:0 ... 65535
|  byte:-128 ... 127
| short:-32768 ... 32767
|   int:-2147483648 ... 2147483647
|  long:-9223372036854775808 ... 9223372036854775807
| float:-3.4028235E38 ... 3.4028235E38
|       SMALL=1.4E-45, EPSILON=1.0E-7
|double:-1.7976931348623157E308 ... 1.7976931348623157E308
|       SMALL=4.9E-324, EPSILON=1.0E-15
  In der folgenden Übersicht wird verlustfreie totale Konvertierbarkeit für alle Werte eines Quell-Typs in einen Ziel-Typ durch Pfeile angezeigt. Totale Konvertierbarkeit erfordert, dass der Zieltyp mindestens so viel Speicher-Bit bereitstellt und mindestens so viele Dezimalstellen-DIGITS aufweist wie der Quell-Typ und ggf. das Vorzeichen oder den Exponent des Quell-Typs darstellen kann.
             ,---------------------------------------,
VVVVVVVVVVVVV| Grundtypen und String (Konvertierung) |VVVVVVVVVVVV
VV           '---------------------------------------'          VV
VV b o o l e a n              b y t e                           VV
VV  1 bit                 8 bit,2 DIGITS                        VV
VV    :                   -2^7...2^7-1                          VV 
VV    :                        |                                VV
VV    :                        v                                VV
VV    :    c h a r         s h o r t                            VV
VV    : 16 bit,unsigned  16 bit,4 DIGITS                        VV
VV    :     0...2^16-1   -2^15...2^15-1                         VV
VV    :       |                |                                VV
VV    :       |                v                                VV
VV    :       '-------------->-+----------------,               VV
VV    :                        v                v               VV
VV    :                      i n t - - - -> f l o a t           VV
VV    :                  32 bit,9 DIGITS  32 bit,7 DIGITS       VV
VV    :                  -2^31...2^31-1  -2^122...2^122°        VV
VV    :                        |                |               VV
VV    :                        |                v               VV
VV    :                        |--------->------|               VV
VV    :                        v                v               VV
VV    :                     l o n g - - -> d o u b l e          VV
VV    :                  64 bit,18 DIGITS 64 bit,15 DIGITS      VV 
VV    :                  -2^63...2^63-1  -2^986...2^986°        VV  
VV    :                        :                :               VV 
VV    :                        v                v               VV 
VV    ························>················>··> S t r i n g VV
VV      --->   numerisch             verlustfrei konvertierbar  VV
VV      - ->   zum nächsten Gleitpunktzahl-Wert  erweiterbar    VV 
VV      ···>   mit Methode valueOf() verlustfrei konvertierbar  VV
VV      °      duale Bereichsabschätzung                        VV
VV                                                              VV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
  Die duale Darstellung der Grundtypen in Bit wird im Abschnitt über Java-Maschinen-Arithmetik (4.3) behandelt. Die maximale Anzahl DIGITS von Dezimalziffern für numerische Typen entnimmt man dem Output des obigen Programms MinMaxValue. Für jeden Grundtyp gibt es in der Klasse String (2.6) eine Methode valueOf(...) zur Konvertierung nach String und umgekehrt im Hüll-Klassentyp, der zum Grundtyp korrespondiert, eine Methode parse...(String) oder eine andere Methode zur Konvertierung von String,
        z.B.   out.print(String.valueOf    ( 2.7 )); // 2.7
               out.print(Double.parseDouble("2.7")); // 2.7

              ,------------------------------------,
VVVVVVVVVVVVVV| Implizite Konvertierung  (Prinzip) |VVVVVVVVVVVVVV
VV            '------------------------------------'            VV
VV Bei korrespondierenden Grundtypen und Hüll-Klassentypen      VV
VV  # wird  der  Grundtyp  in den Hüll-Klassentyp durch Boxing  VV
VV    konvertiert,                                              VV
VV                                                              VV
VV     z.B. boolean b=true;Boolean B=b;//B.booleanValue()==true VV
VV                                                              VV
VV  # wird  der Hüll-Klassentyp in den Grundtyp durch Unboxing  VV
VV    konvertiert,                                              VV
VV                                                              VV
VV     z.B. Boolean B=new Boolean(true);boolean b=B; // b==true VV
VV                                                              VV
VV Bei binären Operationen (4.2)                                VV
VV  # mit  numerischen  Operanden  wird der speziellere Typ in  VV
VV    den  allgemeineren Typ numerisch verlustfrei oder erwei-  VV
VV    ternd zum nächsten Gleitpunktzahl-Wert konvertiert,       VV
VV                                                              VV
VV     z.B. 'c'+1                   // (int)'c'==99, 'c'+1==100 VV
VV                                                              VV
VV  # mit  Operanden  vom Typ char/byte/short wird verlustfrei  VV
VV    nach int konvertiert.  Man kann explizit nach char/byte/  VV
VV    short zurückkonvertieren,                                 VV
VV                                                              VV
VV     z.B. char c='#';c=(char)(c+c);        // c+c==66, c=='B' VV
VV                                                              VV
VV Bei Zuweisungen (5.1)                                        VV
VV  # mit  numerischen Operanden wird falls möglich der rechte  VV
VV    Operand in den Typ des linken Operanden verlustfrei oder  VV
VV    erweiternd zum nächsten Gleitpunktzahl-Wert konvertiert,  VV
VV                                                              VV
VV     z.B. int i=123456789;float f;f=i;     // f==1.23456792E8 VV
VV                                                              VV
VV  # mit konstantem Ausdruck (Synt.060) auf der rechten Seite  VV
VV    und  einem linken Operanden vom Typ char/byte/short wird  VV
VV    der  rechte Operand in den Typ des linken Operanden kon-  VV
VV    vertiert,  wenn der konstante Ausdruck verlustfrei (ein-  VV
VV    engend) im Typ der linken Seite darstellbar ist,          VV
VV                                                              VV
VV     z.B. char c;c=33;                              // c=='#' VV
VV                                                              VV
VV Beim Überladen (7.3),                                        VV
VV  # wenn mehrere Methoden bezüglich ihrer Parametertypen als  VV
VV    "numerisch verlustfrei  konvertierbar  oder zum nächsten  VV
VV    Gleitpunktzahl-Wert erweiterbar"  in Frage kommen,  wird  VV
VV    diejenige ausgewählt, die den geringsten Konvertierungs-  VV
VV    aufwand (siehe oben "Grundtypen und String") erfordert.   VV
VV                                                              VV
VV     z.B. int i=9;double d;d=Math.sqrt(i);           // d=3.0 VV
VV                                                              VV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
  Explizit ist jeder numerische Typ in jeden anderen numerischen Typ mit einem Grundtyp-Konvertierungsoperator (PrimitiveType Cast -Operator, 4.2.2) ggf. mit Verlust konvertierbar,
                 z.B.   out.print((int)2.7); // 2

  Implizit konvertiert wird in Java nur numerisch verlustfrei oder erweiternd zum nächsten Gleitpunktzahl-Wert. Implizit gerundet wird nicht, außer bei der formatierten Ausgabe (2.7).


2.2      boolean Logik


  Der Typ boolean, George Boole: "The laws of thought" (1847), d.h. die Menge der logischen Werte false, true, ist der logische (boolean) Typ. Konvertierung von boolean in numerische Typen und umgekehrt ist nicht möglich. Für logische Operanden sind logische Operatoren ! (nicht), && (und), || (oder), Gleichheitsoperatoren == , != und Zuweisung = zulässig. Wichtige Anwendungen sind Verzweigungen (5.2) und Schleifen (5.3).
  Zum Grundtyp boolean gibt es im Paket java.lang den korrespondierenden Hüll-Klassentyp Boolean.


2.3      char Unicode-Zeichen


  Der Typ char besteht nach den Syntaxdiagrammen für Eingabe-Zeichen (Synt.004) und Zeichen-Literalen (Synt.010) aus Unicode-Eingabezeichen (UnicodeInputCharacter), d.h. Zeichen aus einem 2-byte Zeichensatz mit den Nummern 0...65535, der mit dem ASCII-Zeichensatz mit den Nummern 0...127 beginnt und fast alle Zeichen aus den natürlichen Sprachen enthält.
004: InputCharacter               EingabeZeichen
        HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
        H                                                H
        H   ,----------------------------------------,   H
        H ->| UnicodeInputCharacter but not LF or CR |-> H
        H   '----------------------------------------'   H
        H                                                H
        HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
010: CharacterLiteral             ZeichenLiteral
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
H                  S i n g l e C h a r a c t e r                 H
H                ,-------------------------------,               H
H       -> ' --->| InputCharacter but not ' or \ |---> ' ->      H
H             |  '-------------------------------' |             H
H             |  ,----------------,                |             H
H             '->| EscapeSequence |----------------'             H
H                '----------------'                              H
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

    z.B.  ' ','+','9','A','a','Ä','ä','\n' (newline, Syntax.008)
  Zeichen-Literale sind durch Apostrophe begrenzt.
  Im folgenden Programm CodePage850 wird die Code-Tabelle der Windows XP DOS-Emulation und des Editors edit ausgegeben.

//********************** CodePage850.java ************************
//     Code Page 850 (DOS Latin-1, DOS Westeuropa) fuer edit     *
//****************************************************************

//            java.lang.                                 Object
import static java.lang.System.out;                   // | `System
import static java.lang.String.format;                // `String

class CodePage850 
 {public static void main(String[] args)         // args ungenutzt

   {String[]
Fig.2.3x.gif
    for(int         i=0;i<16;i++)                 // Zeile  i
     {    out.print(format("%3d ",16*i));         // Nummer links

      for(int       j=0;j<16;j++)                 // Spalte j
       {            int k=16*i+j;                 // Nummer k
        if         (         i<= 1)               // CTRL 
         {out.print(CTRL[i-0].substring(3*j,3*j+3));}
        else if    ( 8<=i && i<= 9)               // CODE 
         {out.print(CODE[i-8].substring(3*j,3*j+3));}
        else if    ( 2<=i && i<= 7                // Ascii
             ||     10<=i         )               // CP850
         {out.print(format("%-3c",(char)k));}               
       }
          out.print(i<7?"\r\n"                    // 1 x Vorschub
                   :"\r\n\r\n");                  // 2 x Vorschub
     }
          out.print("<+,"                         // copy omission
                    +"u\",i`,A°,E',O/ "           // javac warning
                    +"Ersatz fuer Windows-'unmappable'");
   }
 }

//****************************************************************
  Der Leser kann das Programm zunächst übergehen und nur die im Output aufgelistete Code-Tabelle betrachten:

Fig.2.3a.gif
Fig. 2.3a: CodePage850 Output


  In der obigen Code-Tabelle wird zu jedem mit der deutschen Tastatur im Code 850 direkt oder mit dem Editor edit darstellbaren Zeichen die CP850-Nummer angegeben, z.B.
  §  Ctr+p,Fn+NumLk,Alt+Ziffernblock(21) CP850: 21 (Unicode: 167)

  A                                      CP850: 65 (Unicode:  65)

  Ä                                      CP850:142 (Unicode: 196)

  |  Fn+NumLk,Alt+Ziffernblock(179)      CP850:179 (Unicode:9474)





  Nur im ASCII-Bereich 32...127 stimmen CP850- und Unicode-Nummer und -Zeichen überein.

  Textuell können nur die 256 CP850-Code-Zeichen in der Windows XP DOS-Emulation dargestellt werden. Das DOS-Kommando chcp zeigt die aktive Codepagenummer an.
                       Aktive Codepage: 850.
  Graphisch mit g.drawString(String,int,int) können alle 65536 Zeichen im Unicode des Java-Applets dargestellt werden.


































  Im folgenden Programm Unicode werden die 65536 Unicode-Zeichen auf 64 Seiten mit je 1024 Zeichen dargestellt.



//************************ Unicode.java **************************
//          Unicode-Tabelle, 64 Seiten mit je 1024 Zeichen       *
//****************************************************************
//            java.lang     .                 Object
import        java.awt.event.*;   // ActionEvent'|||ActionListener       
import static java.awt      .Color.*;//     Color'||           |
import        java.awt      .*;      //  Component'`FlowLayout |
                                     //Container'`Button       |
import        java.applet   .Applet; // `Applet----------------'

public class Unicode extends Applet implements ActionListener
 {int                 size,off=0;
  final Color         B=BLACK,G=GREEN.darker(),R=RED,S=BLUE;
  final int[]         d={-10240,-1024,+1024,+10240};
  final Button[]      b={new Button("-10240"),new Button("-1024"),
                         new Button( "+1024"),new Button("+10240")
                        };
  public void paint(Graphics g)             // overrides Component
   {for(int           i=0;i<b.length;i++)
     {b[i].setEnabled(0 <= off+d[i] && off+d[i]+1024-1 <= 65535);}
    int               x,y;
    for(int           j=off;j<off+1024;++j)
     {                x=(1+j%32*2)*size/4;y=(4+(j-off)/32)*size;
      if             (j%32==0)
       {g.setColor(B);g.drawString(""+j,x,y);
       }g.setColor  ((Character.isISOControl         (j) ?R
                    :(Character.isJavaIdentifierStart(j) ?G
                    :(Character.isJavaIdentifierPart (j) ?S:B))));
                      g.drawString(""+(char)j,2*x+3*size,y);
     }  g.setColor(R);g.drawString("ISOControl",  7*size,37*size);
        g.setColor(G);g.drawString("JavaLetter", 13*size,37*size);
        g.setColor(S);g.drawString("JavaDigit" , 19*size,37*size);
        g.setColor(B);g.drawString("Others"    , 25*size,37*size);
   }
  public void actionPerformed(ActionEvent e)     // ActionListener
   {String            s=e.getActionCommand();
                      s=(s.startsWith("+") ? s.substring(1) : s);
                      off+=Integer.parseInt(s);
    repaint();
   }
  public void start()            // overrides Applet, calles paint
   {                  size=getHeight()/38;
    setFont          (new Font("SansSerif",Font.BOLD,size));//Cont
    for(Button        each:b) 
     {add            (each);                          // Container
      each.addActionListener(this);                // this Unicode
     }                                                             
   }                                                              
 }                             // FlowLayout is default for Applet
//****************************************************************
  Der Leser kann das Programm zunächst übergehen und nur die dargestellten Code-Seiten betrachten:

Fig.2.3b.gif
Fig. 2.3b: Unicode Darstellung
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   >
<!--***************** Unicode.html ****************************-->
    <meta http-equiv="content-type"
             content="text/html;charset=ISO-8859-15"             >
    <title>           Unicode                             </title>
    <applet     code="Unicode.class" width="636" height="684"    >
                      Unicode                            </applet>
<!--***************** width=Hochformat height=38*size *********-->
  Zum Grundtyp char gibt es im Paket java.lang den korrespondierenden Hüll-Klassentyp Character.

2.4      byte/short/int/long Ganzzahlen

  Ganzzahlen, d.h. nicht-gebrochene (ohne Dezimalpunkt) ggf. vorzeichenbehaftete Zahlen, sind gemäß ihrem Ganzzahltyp (IntegralType) byte/short/int/long und korrespondierendem Hüll-Klassentyp Byte/Short/Integer/Long in Bereichen MIN_VALUE ... MAX_VALUE definiert, z.B. ist byte definiert im Bereich
 -128==Byte.MIN_VALUE ... -3 -2 -1 0 1 2 3 ... Byte.MAX_VALUE==127
  Die Bereichsgrenzen MIN_VALUE und MAX_VALUE entnimmt man dem Output des Programms MinMaxValue (2.1).



  Ein Ganzzahl-Literal (IntegerLiteral), d.h. eine explizit im Programm vorkommende Ganzzahl, ohne führendes Vorzeichen, das als unärer Operator (4.2) noch davor gesetzt werden darf, ist nach Syntaxdiagramm 020 von der Form
020: IntegerLiteral               GanzzahlLiteral
      HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
      H                                                    H
      H            D e c i m a l IntegerLiteral            H
      H     ,--------------,    ,--------,                 H
      H --->| NonZeroDigit |--->| Digits |------,          H
      H  |  '--------------' |  '--------'      |          H
      H  |                   v                  |          H
      H  '-> 0 ------------->-------------------|          H
      H         |   O c t a l IntegerLiteral    |          H
      H         |               ,-------------, |          H
      H         |-------------->| OctalDigits |-|          H
      H         |               '-------------' |          H          
      H         |   H e x IntegerLiteral        | default  H     
      H         |-> X -------,  ,-----------,   | int      H    
      H         '-> x --------->| HexDigits |---+->----,   H
      H                         '-----------'   |-> L -|   H
      H                          LongTypeSuffix '-> l ---> H
      H                                                    H
      HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

    z.B.  1234567890    dezimal     int
          0             dezimal     int
          08888888888   oktal       int    8^10-1=1073741823
  Für die typgenaue Kennzeichnung von long-Ganzzahlen gibt es das Suffix L oder l,
    z.B.  0xFFFFFFFFFFl hexadezimal long  16^10-1=1099511627775L



























2.5      float/double Gleitpunktzahlen 

  Gleitpunktzahlen, d.h. gebrochene (mit Dezimalpunkt) ggf. vorzeichenbehaftete Zahlen, sind gemäß ihrem Gleitpunktzahltyp (FloatingPointType) float/double und korrespondierendem Hüll-Klassentyp Float/Double in Bereichen -MAX_VALUE ... MAX_VALUE definiert,
z.B. ist double definiert im Bereich
 -1.7976931348623157E308 == -Double.MAX_VALUE ...
                   ... Double.MAX_VALUE == 1.7976931348623157E308
  Für Gleitpunktzahlen benötigt man, anders als für Ganzzahlen, auch Angaben darüber, wie dicht man an 0.0 herankommt (SMALL= Double.MIN_VALUE) und wie dicht man an 1.0 herankommt (EPSILON). Die Bereichsgrenze Double.MAX_VALUE und die Differenzen SMALL= Double.MIN_VALUE und EPSILON entnimmt man dem Output des Programms MinMaxValue (2.1).



  Ein Gleitpunktzahl-Literal (FloatingPointLiteral), d.h. eine exlizit im Programm vorkommende Gleitpunktzahl, ohne führendes Vorzeichen, das als unärer Operator (4.2) noch davor gegesetzt werden darf, ist nach Syntaxdiagramm 021 von der Form
021: FloatingPointLiteral         GleitpunktzahlLiteral
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
H                                                                H
H     H e x F l o a t i n g P o i n t L i t e r a l              H          
H ---> 0 ---> X -,                                               H 
H  |      '-> x -|                                               H
H  | ,-------------------> . --------,                           H
H  | |  ,---------,                  |  ,-----------,            H
H  | '->|HexDigits|------> . ------->-->| HexDigits |-,          H
H  |    '---------' |         |         '-----------' |          H
H  |                |         '---------------------->|          H     
H  |                |  ,------------------------------'          H
H  |                |  |   BinaryExponent                        H
H  |                '->+-> P -,         ,--------,               H
H  |                   '-> p -+-> - --->| Digits |----,          H           
H  |                          |-> + -|  '--------'    |          H
H  |                          '->----'                |          H
H  |                              + default           |          H
H  |  D e c i m a l F l o a t i n g P o i n t Literal |          H
H  |---------------------> . --------,                |          H
H  |    ,--------,                   |  ,--------,    |          H
H  '--->| Digits |-------> . ------->-->| Digits |-,  |          H
H       '--------'  |         |         '--------' |  |          H
H                   |         '------------------->+->|          H          
H                   |  ,---------------------------'  |          H
H                   |  v   ExponentPart               | default  H
H                   |->+-> E -,         ,--------,    v double   H
H                   |  '-> e -+-> - --->| Digits |----+->----,   H                  
H                   |         |-> + -|  '--------'    |      |   H
H                   |         '->----'                |      |   H
H                   |             + default           v      |   H
H                   '-------------------------------->+-> D -|   H
H                                    DoubleTypeSuffix |-> d -|   H
H                                                     |-> F -|   H
H                                     FloatTypeSuffix '-> f ---> H
H                                                                H
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

     z.B.  .1  1.  1E1  1f  1D  3.14==314E-2==0.314E1==0.314E+1

  Für die typgenaue Kennzeichnung von float-Gleitpunktzahlen gibt es das Suffix F oder f, für die typgenaue Kennzeichnung von double -Gleitpunktzahlen das Suffix D oder d. Gleitpunkzahlen werden nicht wie Ganzzahlen dual im Prozessor, sondern i.a. dezimal im Koprozessor berechnet.

  Der Name Gleitpunktzahl rührt daher, dass bei Multiplikation mit Zehnerpotenzen "10 hoch n" (n ist eine Dezimal-Ganzzahl), geschrieben als En, der Dezimalpunkt nach links (n negativ) oder rechts (n nichtnegativ) "gleitet", z.B.
         1.234567 entspricht 0.01234567E2 oder 123.4567E-2

2.6      String als Referenztyp, Zeichenketten-Literale


  String ist eine Klasse des Pakets java.lang. Als Klassentyp ist String ein Referenztyp (Synt.030), kein Reihungstyp (6), wie z.B. char[], und kein Grundtyp (2), wie z.B. char. Insbesondere ist eine String-Variable oder ein Zeichenketten-Literal (siehe unten) nicht wie eine Reihung mit eckigen Klammern [] indizierbar, sondern mit Hilfe der in der Klasse String vereinbarten Methode charAt(),
     z.B.         "StringLiteral".charAt(6) == 'L'
  Ein Zeichenketten-Literal (StringLiteral) ist eine Konstante vom Typ String, nach Syntaxdiagramm 011 von der Form
011: StringLiteral                ZeichenkettenLiteral
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
H                                                                H
H            ,------------------------------------,              H
H            |    S t r i n g C h a r a c t e r   |              H
H            |  ,-------------------------------, |              H
H      -> " -+->| InputCharacter but not " or \ |-| ,-> " ->     H
H            |  '-------------------------------' | |            H
H            |  ,----------------,                | |            H
H            |->| EscapeSequence |----------------' |            H
H            |  '----------------'                  |            H
H            '--------------------------------------'            H
H                                                                H
H EscapeSequence  is only repla-  FluchtzeichenFolge(n)     sind H
H cement here for LF CR " \       hier  die einzige Möglichkeit, H
H                                 LF CR " \ darzustellen.        H
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

   z.B.   " " , "9" , "A" , "Max und Moritz" , "Zeile1\nZeile2"
  Die nicht direkt in Anführungsstrichen darstellbaren Zeichen LF CR " \ lassen sich als Fluchtzeichenfolge (EscapeSequence, Synt.008) darstellen:
    "\n"  (newline, linefeeed LF)   "\r"  (carriage return CR)
    "\""  (double quote ")          "\\"  (backslash \)

  Für String-Operanden sind der Katenationsoperator + und die Gleichheitsoperatoren == , != zulässig.
  Die String-Katenation s=s1+s2, d.h. die Aneinanderfügung von s1 und s2 zu einem neuen String s, ist definiert für mindestens einen String-Operanden und höchstens einen Grundtyp-Operanden, wobei der Grundtyp-Operand vor der Katenation implizit mit Hilfe der in der Klasse String für jeden Grundtyp vereinbarten Methode valueOf() in einen String umgewandelt wird,
        z.B.   "die "+(3+4)+" Zwerge" == "die  7 Zwerge"
               "die "+ 3+4 +" Zwerge" == "die 34 Zwerge"
  Die Gleichheit == gilt nur für Zeichenketten-Literale. Mit Hilfe der in der Klasse String vereinbarten Methoden intern(), equals() läßt sich jedoch auch die Gleichheit von String-Variablen (Referenzen) überprüfen,
        z.B.   String s="String";                
               out.print(s         =="String" ); // false
               out.print(s.intern()=="String" ); // true
               out.print(s.equals(   "String")); // true
  Für String-Relationen "kleiner", "größer" gibt es keine Operatoren. Statt dessen gibt es die in der Klasse String vereinbarte Methode compareTo() für lexikographischen Vergleich (Unicode 2.3),
    z.B.   out.print("String".compareTo("Literal")<0); // false
           out.print("Literal".compareTo("String")<0); // true
  Die Länge eines Strings ist bestimmbar mit der in der Klasse String vereinbarten Methode length(),
               z.B.   "StringLiteral".length() == 13
  Zeichenketten-Literale sind Konstanten, auch bezüglich ihrer char Bestandteile, d.h. es gibt kein setCharAt(,) in der Klasse String. Aber String-Variable (Referenzen) lassen sich auf andere Zeichenketten-Literale "umklinken",
                    z.B.   String s="vorher";
                                  s="nachher";
  "Neue Bestandteile von String-Variablen" lassen sich mit Hilfe der in der Klasse String vereinbarten Methoden substring(...) per Katenation "einsetzen",
     z.B.   String s="Adam";
                   s=s.substring(0,1)+"mster"+s.substring(1);
            out.print(s); // Amsterdam
  Für jeden Grundtyp gibt es in der Klasse String (2.6) eine Methode valueOf(...) zur Konvertierung nach String und umgekehrt im Hüll-Klassentyp, der zum Grundtyp korrespondiert, eine Methode parse...(String) oder eine andere Methode zur Konvertierung von String, vgl. Typ-Konvertierung (2.1),
      z.B.   out.print(String.valueOf    ( 2.7 )); // 2.7
             out.print(Double.parseDouble("2.7")); // 2.7











2.7      Format-String

  In der Dokumentation der Klasse Formatter des Pakets java.util wird der format_string der Methode
   String format(String format_string,Object... args)
der Klasse String des Pakets java.lang syntaktisch genau beschrieben. Damit läßt sich sowohl textuelle Ausgabe, z.B. (3 Varianten)
 System.out.print(String.format(">%6.3f<",Math.PI)    );//> 3,142<
 System.out.             format(">%6.3f<",Math.PI)     ;//> 3,142<
 System.out.printf             (">%6.3f<",Math.PI)     ;//> 3,142<

als auch graphische Ausgabe formatieren, z.B.

 g.drawString    (String.format(">%6.3f<",Math.PI),x,y);//> 3,142<

  Der Format-String ">%6.3f<" zur Formatierung des Arguments Math.PI enthält den eigentlichen Format-Spezifizierer %6.3f sowie vorangehend auszugebenden Text ">" und nachfolgend auszugebenden Text "<". Das allgemeine Fluchtsymbol % zeigt den Anfang des Format-Spezifizierers an. Das spezielle Format-Konvertierungs-Fluchtsymbol f (floating point ohne Zehnerpotenz) zeigt das Ende des Format-Spezifizieres an. Die minimale Gesamtbreite (width) der Gleitpunktzahl einschließlich Dezimalseparator und führender Zwischenraumzeichen ist 6. Die Präzision (precision) der Gleitpunktzahl, d.h. die Breite nach dem Dezimalseparator, ist 3. Die letzte Ziffer nach dem Dezimalseparator wurde auf 2 gerundet.


  Der Dezimalseparator ist in dem voreingestellten Gebiet Locale.GERMAN ein Komma ','. Der Dezimalseparator kann mit Locale.US auf Punkt '.' umgestellt werden, z.B.
   System.out.printf(Locale.US,">%6.3f<",Math.PI); //> 3.142<
  Der Format-String kann mehrere Format-Spezifizierer aufweisen, die sich auf die verschiedenen Argumente in der Argumentliste beziehen. Der Bezug wird jeweils hergestellt durch Setzen eines Argument-Index (argument_index) mit abschließendem Dollar '$' an den Anfang des betreffenden Format-Spezifizieres, z.B.
   import static java.lang.System.*;             
   import static java.lang.Math.*; ...
   out.printf("PI=%1$5.2f E=%2$4.2f",PI,E); //PI=3,142 E=2,72

  Wir geben eine Übersicht über die wichtigsten der in Formatter dokumentierten Bestandteile von Format-Strings:
                  ,----------------------------,
VVVVVVVVVVVVVVVVVV| Format-String ( Übersicht) |VVVVVVVVVVVVVVVVVV
VV                '----------------------------'                VV
VV # conversion ist das Konvertierungssymbol, u.a.:             VV
VV   b,B  bedeutet boolean                                      VV
VV   c,C  bedeutet char                                         VV
VV   d    bedeutet decimal integer                              VV
VV   f    bedeutet floating point ohne Zehnerexponent           VV
VV   s,S  bedeutet String                                       VV
VV   td   bedeutet time day  ,2-stellig,ggf.führende Null       VV
VV   tm   bedeutet time month,2-stellig,ggf.führende Null       VV
VV   ty   bedeutet time year ,2-stellig,ggf.führende Null,      VV
VV   z.B.  import java.util.*;                                  VV
VV         import static java.util.Calendar; ...                VV
VV             Calendar c=new GregorianCalendar(2006,APRIL,16); VV
VV             System.out.printf("Ostern:%1$td.%1$tm.%1$ty",c); VV
VV                              //Ostern:16.04.06               VV
VV # width ist die minimale Gesamtbreite  einschließlich  Dezi- VV
VV        malseparator und führender Zwischenraumzeichen,  eine VV
VV        Dezimal-Ganzzahl >0 .                                 VV
VV        Da es sich um eine Minimal-Angabe handelt, könnte die VV
VV        Ausgabe darüber hinausgehen,                          VV
VV                                                              VV
VV   z.B.  System.out.printf(">%1.3f<",Math.PI ); //>3,142<     VV
VV                                                              VV
VV # flag (width-Vorzeichen, + default) ist die Bündigkeit:     VV
VV                                                              VV
VV  +     bedeutet "rechtsbündig" innerhalb width,              VV
VV  -     bedeutet  "linksbündig" innerhalb width.              VV
VV        Nötigenfalls wird links (+) oder rechts (-) mit       VV
VV        Zwischenraum (Space) aufgefüllt,                      VV
VV                                                              VV
VV   z.B.  System.out.printf(">%-6d<","links");  //>links <     VV
VV                                                              VV
VV # precision ist die Anzahl (Präzision)  der Stellen nach dem VV
VV        Dezimalseparator, eine Dezimal-Ganzzahl >= 0 .        VV
VV        Nötigenfalls  wird  rechts mit Nullen aufgefüllt oder VV
VV        gerundet. Für precision=0 entfällt der Dezimalsepara- VV
VV        tor,                                                  VV
VV   z.B.  System.out.printf(">%6.3f<",3.14   ); //> 3,140<     VV
VV         System.out.printf(">%6.3f<",Math.PI); //> 3,142<     VV
VV         System.out.printf(">%6.0f<",Math.PI); //>     3<     VV
VV                                                              VV
VV # argument_index  ist der Index (die Position) des Arguments VV
VV        in der Argumentliste, eine Dezimal-Ganzzahl >=1,      VV
VV   z.B.  import static java.lang.System.out;                  VV  
VV         import static java.lang.Math.PI; ...                 VV
VV         out.printf("PI=%1$5.2f E=%2$4.2f",PI,E);             VV
VV                      // 1$ 1-tes  2$ 2-tes Argument in Liste VV
VV                                        // PI=3,142 E=2,72    VV
VV                                                              VV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

2.8      Testfragen
zu    Frage                                  | abdeckbare Antwort
---------------------------------------------+--------------------
2.1   Mit wieviel Bits wird int dargestellt? | 32 (-Bit Maschine)
                                             |
2.2   Ergänze die Definitionsschemata:       |                     
                                             |
        == |false true       != |false true  |   != |false true 
      -----+-----------    -----+----------- | -----+-----------
      false|true  false    false|  ?     ?   | false|false true 
      true |false true     true |  ?     ?   | true |true  false
                                             |
        && |false true       || |false true  |   || |false true 
      -----+-----------    -----+----------- | -----+-----------
      false|false false    false|  ?     ?   | false|false true 
      true |false true     true |  ?     ?   | true |true  true 
                                             |
2.3      Welche der folgenden sind korrekte  |
2.6   CharacterLiteral oder StringLiteral?   |
      ''                                     | inkorrekt
      "in "DM" Preis"                        | inkorrekt
      '"'                                    | CharacterLiteral
      "dreifach\"Hoch\""                     | StringLiteral
                                             |
2.4      Gibt es verschiedene IntegerLiteral | ja
      mit gleichem Wert?                     | z.B.   17 und 0x11
                                             |
2.5      Was wird ausgedruckt?               | beachte: für double  
                                             | ist DIGITS=15 (2.1)
      out.print(1e25+1e5-1e25);              | (1e25+1e5)-1e25=
                                             |  1e25     -1e25=0.0
                                             | gedruckt wird   0.0
      out.print(1e25-1e25+1e5);              | (1e25-1e25)+1e5=
                                             |  0.0       +1e5=1e5
                                             | gedr. wird 100000.0
2.4      Welche der folgenden sind  korrekte |
2.5   Zahlbezeichnungen (Literale)?          |
      10X10                                  | inkorrekt
      E10                                    | inkorrekt
      0X0                                    | HexIntegerLiteral
      10.10E10                               | FloatingPointLit.
                                             |
         Was wird ausgedruckt?               |
                                             |
    import static java.lang.System.out; ...  |
2.6 out.print("es gilt: " +"2+2"+" ist  "+4);| es gilt: 2+2 ist  4
    out.print("es gilt:  "+ 2+2 +" ist 2"+2);| es gilt:  22 ist 22
2.5 out.print(Math.PI);                      |3.141592653589793 
2.7 out.printf("%5.2f",Math.PI);             | 3.14 (vorn 1 space)
    Java Programmierung
  Kap.03