16
5 Java-Datentypen Es ist ein Ke nn ze ic he n "gute r" Programmk-rs prach cn, den Entwickler zu zw inge n, jede Variable und Konstante nicht nur mit ihrem Namen sondern auch mit ihrem 7)1J zu dekla riere n. Bevo r also e ine Variable im Programm ver we ndet werden kan n, muss festgeschrieben w erden , vonw elchem Typ diese Variable ist. Andernfalls kann die Variable nicht verwendet werden lind der Compiler ' ... eigen sich, da s Programm zu komp ilieren. Bei schwach typisierten Sprachen w ird der Typ einer Variablen nicht explizit dekla- den wird, sondern ergibt sich aus dem zuge wiesene n \V CI1. Bei Java hingegen han- delt es steh uru eine starte typisierte Sp r ache . Es e xistieren vo rde finierte Standard - J)al eIl 0 1)(!1I, die für verschiede ne Alt en von Zahlen und Zeichen vorgesehen sind. (Allerdings erlaubt es das Kl asse nkonzept. auch selbst definierte, kom plexe Datenry- pcn zu verwend en. Doch dazu spärcr.j Durch den Typ der Variablen wird die Art der internen bin ären Codierung festgelegt. Dadurch steht fest, wie grog der S petcteröer etcb (Bytes) ist, d en ein \'(ren im Spei- cher belegt und wie der wencbere tcb ist, der mit der Codierung abgebildet we rden kann. Ferner is! definiert , welche Operation en de r entspreche nde Date-ntyp zulässt und welche Zuweisungen zwischen verschiedenen Typen erlaubt sind. Typisie rung ist ein fundamentales Konzept mod erner Pr ogmmnucrsprachcn. Der Comp iler kann prüfen und erzwingen, dass im späteren Programmvertauf einer Vari- ablen nur passende. ihr em Typ und Weltebereich entsprechende Daten zugewiesen un d mit de r Variablen nur erlaubte Operation en durchgefühlt werd en. Es handelt sich um eine stausehe 7}1JpriiJ il l lfJ, währen d des K omp tlanonsvorgangs (Com pilezch) noch vor der Progr ammausführung ( La ufzeit). Die Angabe des Datentyps einer Vari- ablen legt f est , welche Daten übe rhaup t in dieser Variablen ges pe iche lt werden können. Die Variable ist im weiteren Progr ammve rlauf l )lJ f.w r echl zu verwe nde n. So kön nen z.B. einer Ganzzahlvariablen keineK omma zahlen zugewiesen werden. Denn wohin mit d en Nach kornmastcllcn? Einer Variablen. die für einen klei nen Zah- l enbereiche vorgesehen ist, kann keine Variable eines groücn Zahlenbereichs zuge- wiesen werde n. Denn wie soll die "zu gr og e " Zahl in der "klein en" Variable n gcs pc l- chert we rde n? Einer Hießkommavariablen kann kein e Zek-lu-nkcrtc zugewiesen werden. Den n wie soll aus der Zei che nkette eine Zahl werden? Der Co mpiler pr üft dank strenger Typisierung, dass nicht "Apfel mit "Birnen" verrechnet werden, bzw. unterbindet Operationen, die mit möglich en Daten verlust e n verbun den sind. 5.1 Deklaration und Inilialisierung Im Umgang mit Variablen und Ko nsta nte n u nte rs cheidet man zwischen Delelaration und tuutattsterung. B eides muss vor der eigentlichen Ver we ndung der Variablen

Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 Java-Datentypen

Es ist ein Ke nn ze iche n "guter" Programmk-rsprachc n, de n Entw ickler zu zwingen,jede Variable und Konstan te nicht nur mit ihrem Namen so nde rn auch mit ihrem 7)1Jzu dekla riere n. Bevo r also e ine Variab le im Programm ve rwende t werden kan n,muss festgeschrieben w erden , von w elchem Typ diese Var iable ist. An dernfalls kanndie Variable nicht verwen det werden lind der Compiler ' ...eigen sich, da s Programmzu kompilieren.

Bei schwach typisierten Sprachen wird der Typ e ine r Variablen nicht explizit dekla­den wird, sondern e rgibt sich aus dem zuge wiesene n \VCI1. Bei Java hingegen han­delt es steh uru eine starte typisierte Sp rache . Es e xistieren vo rde finierte Standard­J)al eIl 0 1)(!1I, die für verschiede ne Alten vo n Zahlen und Zeichen vorgesehe n sind .(Allerd ings erlaub t es das Klassenkonzept. auch selbst definierte , komplexe Datenry­pcn zu verwenden. Doch dazu spärcr.j

Durch den Typ der Variablen wird d ie Art der internen binären Codierung fe stgelegt.Dad urch steht fest , wie grog der Spetcteröeretcb (Bytes) ist, den ein \'(ren im Spei ­che r be legt und wie gro f~ de r wencbere tcb ist, der mit der Codierung abgebildetwe rde n kann. Ferne r is! definiert , welche Operation en de r entsprechende Date-ntypzuläss t und welche Zuweisungen zwischen versch iede ne n Type n e rlaubt s ind .

Typisie rung ist ein fundamentales Konzept moderner Progmmnucrsprachcn. DerCompiler kann prüfen und erzwinge n , da ss im späteren Prog rammvertauf einer Vari­ab len nu r passende. ihrem Typ und Welt ebereich entspreche nde Daten zugewiesenund mit de r Variablen nur erlaubte Operat ion en durchgefühlt werden. Es ha ndeltsich um eine stausehe 7}1JpriiJil l lfJ, während des Komptlanonsvorgangs (Compilezch)noch vo r de r Progr ammausführung ( Laufzei t). Die Angab e des Datentyps eine r Vari­ab len legt fest, welche Daten übe rhaupt in d ieser Variablen ges pe iche lt werdenkönnen. Die Variab le ist im we ite ren Prog rammve rlauf l)lJf.w rechl zu verwe nde n.

So kön nen z.B. e ine r Ganzzahlvariablen keine Kommazah len zugewiesen we rden .Denn wo hin mit den Nach kornmastcllc n? Einer Variablen . die für einen kleinen Zah­lenbereiche vorgesehe n ist, kann kein e Variable e ines groü cn Zahlenbereichs zuge­wiesen werde n. Den n wie soll die "zu groge " Zahl in der "klein en" Variable n gcspc l­chert we rde n? Einer Hießkommavariablen kann kein e Zek-lu-nkcrtc zuge wiesenwerden. Denn wie soll aus der Zeichenket te eine Zahl we rden? Der Co mpiler pr üftdank strenger Typisierung, da ss nicht "Apfel mit "Birnen" verrechnet we rde n, bzw.unterbindet Operationen , die mit möglichen Datenverlust en verbunden sind.

5.1 Deklaration und InilialisierungIm Umga ng mit Variablen und Ko nstante n unte rscheidet man zwische n Delelarationund tuutattsterung. Beides muss vor der eigentliche n Verwendung de r Variab len

Page 2: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

11 5 [at '(I -Datentypen

bzw. Konstante n gesche he n. De klaration und lrutialisic rung können in separate nA nw eisungen oder in ei ner einzigen Anweisung erfolgen:

• Deklaration einer Variablen I Ko nstante n bedeutet, da ss Typ und Name derVariablen / Kon stanten angegeben werden, d.h. diese /,0,. ihrer weiteren Ver­wendung bekannt gemach t wird. Bei Programmallsführung wird durch die De­klaration ein dem Typ entspreche nde r Speicherbereich reserviert. Dabei müsse nalle innerhalb eil/es lJ/och verwendeten iVa men eindeutig se in. Eine aufzählen­dc Dek laratio n mehrerer Var iablen des gleiche n Typs ist möglich. Die Deklarati­on endet, wie jede Anweisung in Java, mit eine m Semikolon.

• Initialisierung einer v ariablen / Konstanten bedeutet , dass dieser vo r ihrerv e rwcndung ein definierter Wien zugewiesen wird. Spätesrens vo r ihrer erstenVe rwend ung (z.B. in Berech nungen ) mus s die lnirialisierung erfolgt se in, (1:1so nst un klar ist, mit welch em Wert kon kret gearbe itet werden soll. Diese Regelbe zeichnet man als Def initir e Asstgment.

Das folgende Java-Progra mm macht das Vorgeben bei Deklaratio n und lnitiali-dcrungdeu tlich. Es wird mit Ganzzahlvariablen vom Typ int (Integer) gc urlx-itct. (Alle Ja ­va-Datcnrypcn werden im fo lgenden vorgcsrcür.)

class Variablen I

publie statie void main ( String[ ) args ) {

int " // Deklaration einer Variablen namens x

x . 100 ; 11 Initialisierung der Variablen x

int ' . y , 11 Deklaration zweier Variablen

y . 200 ; I/ Initialisierungen de, Variablen y

int s . 400 ; I/ Deklaration und Initialisierung

// Deklaration und Initialisierung zweier Variablen :

int geha ltl = 2000 , gehalt2 = 3000 ;

x = y + 100 ; // OK : Variable y wurde zuvor initialisiert

System ,out .println( " x "," + x + " y = " + y + " s ..... + S ) ;

/ ' Das folgende Coding akzeptiert der Compiler nicht :

k 100 ; // Fehler 1: Variable k nicht deklariert!

s = z + 200 ; // Fehler 2: Variable z nicht initialisiert!

int x = 30 ; // Fehler 3: Mehrfachdeklaration von x!

,/

Ix=300 y "'200 s : 400

- Konsole -

Die ausk ommentierten Codeze ile n würde der Compiler mit deutli chen Fehle rmel­dungen wegen au sbleibender Deklaration oder Intrtaltstcru ng bzw. Mehrfachdcklara­tion quitti eren:

Page 3: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku -a-natentypen 15

Bei Fehler 1: cannot resoli-c symbol symbol: variable k

Bei Fehler 2: variable Z /li/Rh' not bare beeil ininaliecd

Bei Fehler 3: x is (I/ready defined in main{ java.la ng.Stringl] )

In dieser Hinsicht untersche idet s ich Java streng von anderen Sprachen, dte bei un ­terlassener Intnaltsterun g eine r Variablen einfach einen Standardwert (z.B. 0 beiCanzzahlrypcn) cin sctzcn . und die vorle tzte Anweisung akzeptieren würden.

Grun dsätzlich unterschefde r man prunttu-c lJatclI1.I'/X'11 lind struistnrierte !JlI tCJlI.ll Je/I.

Bei de n fest in de r Sprache verankerten Standarddatentypen von Ja va handelt es sichUlll primitive Datentypen . d ie nu r einen bestimmte n \Vc' I1 aufnehme...n könne n. Im

Gegensatz dazu stelle n Klassen strukturierte , selbsrdeflnlertc komplexe Datentype ndar, die mehrere Datenwerte aufn ehmen können.

Literale. Einfache Datenobjekte sind t.uerate. Dabei handelt es sich um direkt in denProgrammtext gesc hriebe ne konstante w erte , Zeichen und z eichenfolgen. sie wer­den gcnau an de r Stelle verwendet. an der sie im Prog ramm auftauchen . Literale be­legen Programmspeicher und haben eine n Typ , jedo ch keinen Namen . Ein Textlite ­ral ist ein einzelnes Zeiche n (Charncrcr) in Hochkommata wie "c ' ode r eine Zci ­ehenket te (Slring) in doppe lten Hochkommata wie " Ha l l o" . Ein Zah lc n litcral isteine Ziffernfolge inklusive o ption alcm Vorzeichen wie - 12 . 3 4 ode r +8 . 9E-5 .

5.1.1 Ganuahlige Datentypen

Für Ganzzahlwerte stehen in Java vier ve rschiede ne Datentypen zur Verfügung. Sieunterscheiden sich in der Zahl der BUs (b inary digits - 1 oder 0, H bit - 1 byte ), d iezur Codierung der Zahlen im Dualsys tem verwe ndet werden . Man spricht auch vo nder lällge eines Typs. Dabei wird ein Bit bereits zur Codierung des Vorze iche ns (+

ode r -) ve rbrauehr. Je mehr Bits zur Zahlencodierun g bereitstehen, desto größer istde r damit da rstellbare Zahlenbere ich. Tabelle 5.1 enthält die vier Ganzzahltypen.

Datentvo Bits We rtebereich Wertebereich

byte 8= 1 bvre ,2' bis i·1 · 128 bis +127

short 16 = 2bvte _2 1< bis 2"_1 -32768 bis + 32767

I nt 32 = 4 bvte -2" bis 2"-1 -2 1474R~64H bis +21474H3647

l ong 64 = 8 b}1e -2" -' bis 2"-'-1 -9223372036854775808 bis+9223372036854775807

Tab, 5.1: Die vier ganzzahhgcn Standarddatentypen der Sprache Java.

Die Datentype n tragen sprechende Namen: Der Typ byt;e hat e ine Linge vo n eine mByte. Der Typ shor t ist nu r halb so lang wie int. Der Typ i n t stellt die Standard­Ganzzahl (Integer) dar. Der Typ long iSI doppelt so lang wie de r Typ int .

Die Zahlenhereiche unt erscheiden sich deutlich . Man wü rde Hauptspe iche r ver­schwcndcn , wenn man stets den grö gtcn Zahlentyp l ong benutzt. Heutzutage stehtRech nern ausreichend Speiche r zur Verfügung, so das s man für die me isten Gan z-

Page 4: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

16 5 [at '(I -Datentypen

zahlvariablen den Typ int wählt. Befi nden sich jedoch mehrere Millionen w erte ineinem Datenbehälte r (z.B. Array) , so sollte dcr Da te ntyp mit Beda ch t gewählt w er­den, um nicht un nötig viel Hauptspeicher zu reservieren.

Andere rseits kann e in zu klein gewählter Date ntyp bewirke n, dass der VariablenWeite zugewiesen werden , d ie de n zulässigen Wertebe reich sprenge n. Von eher­oder Untertauf spricht man , wenn eine r Variab len Werte zugewiese n werden , diegröße r ode r kleiner sind als der Wertehe reich des Variahlcntyps.

Die Wahl des korre kten, der Problemste llung ange messenen Datentyps liegtin de r Vera ntwort ung des Entwicklers.

Zur Notation. Durch da s Suffix I ode r I. werden Zahle n explizit als Lcnq-w crtc gc ­kennzeichnet . [)(ji::lIIlf (Srandard ) ist int , d. h. ohne Suffix-Angabe ge hl der Compilervon eine m Lrrt-Wert aus. Der Typ eine r Gan zzahl in Java ist standa rdmäßig int .

Lonc-w crrc. 100L 151 456L in t -\,\'e rte : 24 2 323458

5.1.2 Fließkommazahl-Datentypen

Fließko mmazahlen (jloati llg potnt numbcrst werden in Java durch die Datentypenf l o a t und d oub l e da rgestellt. Der mit 64 h it kodierte Typ do ub l e ist doppelt solang (doub le prccislon ) wie der Typ float (siegle prccision ) und kann n icht nurgröüerc positive und negative Zahlen darstellen ..ls der 32-hil-Typ f loat, sondernauch Kommazahlen gc naucr, mit deutlich mehr zuverlässigen. sig llijihlllfeJl Nach­konunaxtcllcn erfassen. Somit Jassen sich mittels double auch kleinere Zahlen er­fasse n als mit f loat . Schon bei e infache n iterat ive n Berechnungen macht sich diesbem erkba r, so da ss me ist de r Typ d o ubl e gewählt werden sollte.

Die Zahlendarstellung bei float und double geschieht (nach No rm IEEE 754) ge ­trennt nach Bits für Vorzeichen , Mantissenwert lind Expo ncnrcn wcrt :

z - (.Ir · Manüsse " 2···,....·p'

Aufgrund der expone ntiellen Zahle ndarstellung kön nen mir floa t (32 bit ) größereZahlen als mit l a n g (64 hitl dargestellt werden, obgleich weniger Bits ve rwendetwe rden - allerdings au f Kosten der Genauigkeit ts.u.) . (Tec hnische Details der FlicK·kommacodtcrung finden s ich in [LOU04].)

ln Tabelle 5.2 sind die wich tigsten Eigenschaften de r Type n f l oat und doublegc gc nübergcsrcllr. Hervorzuheben ist d ie unters ch iedliche Zahl signifikan te r Dczi­malsrclk-n. d ie zuverlässig dargestellt werden kön nen.

Datentyp Bits V M ant. Ex p . zahtcnbcretch Dezimal-(Bits ) (Bits) (Bits) s tellen

float 32 = 4 Byte 1 23 H '" -2· \0'" bis +2-10'" 7

d ouble 64 - H Byte 1 52 11 ", -2·10' " bis +2·10' " 15

Tab. 5.2: Die Flicßkolllllla-Swndan.lda tt.'ntypcn de r Sprache java.

Aus de r Zahlendarstellung fo lgt für float und double:

Page 5: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku -a -n atentype n 17

• Floa t: WcI1l' von z'" his 2·"' , e ntsp ric-ht etwa 2*10 '" b is 2*10'-'" , Man tisse nwe r­

Te im Abstand 2 1' "" 10 ' , entspricht 7 Dezimalstellen Genauigkeit.

• Double: Werte von 2 'uU bis 2 " ' ~-' , entspricht etwa 2" 10' " bis 2.10·· .. , Manns-senwe rte im Abstan d 2 " "" 10 "' , entspricht 15 Dezimalst ellen Ge nauigkei t.

Eint.' doub le-Zahl kann mehr korre kte Dezimalstellen lind eine n gröf.~e n.-n \Ve/1ebe­

reich als eine floa t -Zahl ohne Gcoauigkcnsvcrlusr speichern .

Alx:r: Die Genauigkeit der Zah lendarstellung ist !Jrinzipiell begrenzt - auch beimRech nen mit double-Zahlen können RU1/dIl IIR_gehlerauft rclel1, die sich auf Polgebe­rech nungen oder v crglct chsopcrartoncn auswirken . So können von den unendlichviele n Ziffern des Bruchs 2/3 (dezimal: 0.66666......) nur end lich viele in eine r flo ­a t- oder d oubLe- Variablc n gespeichert werden , was einem Abschneidenron Nach ­leonnnastclien entsp rich t.

Für Ganzzahl- und llicßkommatvpc n gilt: Das Rec-hnen mil Gk-ukommazahk- n istintern aufwendiger und ungenaue r als das Rechn en mit ganzen Zahlen. Somit solltend ie Datentypen floa t und double nu r gewählt werden , wenn dies aufgrund derProb lemstellung und der auftretenden Werte erforderlich ist.

Zur Notation. Durch das Suffix d oder D werden Zahlen als double -werte ge kenn ­ze ichnet , durch Suffix f oder I: als float-wert c. Der txfautt ist double, d.h . o hneSuffix-Angabe geht der Compiler vo m Typ double aus .

Float-Wcrte: 2.4f 2.4F 3.f 3.F

Double-Werte : 2.4d 2.4D 3.d 3.D 4.75 2.

Das folgende Beispiel zdgt, dass scho n bei relativ kleinen Zahlenwerten die f Loa t­spezifische Begrenzu ng auf nur sieben stgnlflkamc Dezimalstellen zu Wcrtvcrfäl­sch ungcn füh ren kann - nur die double-Variab le enthä lt de n korrekten W'ert:

c l as s TestFl oatDoubl e {

public s tatic void main ( String [ ] args ) 1

fl o at f 12 3 456789 . 0f ; 1/ Mehr als 7 signifikante Stellen!

double d = 1 2 34 5 67 89 . 0 ;

Sys t em vcut cp r i.nt. Ln I " F l oa t - We r t f

System. o u t . p r i n t l n ( " Do ub l e - We r t d

Konsole -

+ f ) ;

+ d ) ;

Float-Wert f

Double-Wert d

5.1 .3 Zeichen

1 . 2 345 67 9 2E8

1.234567 8 9E8

Für einzelne Zeichen ( Cha racterst existiert der Datentyp char. Dahe i handelt essich um eine n mit 16-bit (- 2 Byte) kodierten Datentyp. Variablen und Konstan ten

Page 6: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

18 5 [at '(I -Datentypen

vom Typ char kön nen e inzelne Zeichen (in einfache Hochkommata eingeschlos­se n ) üb ergeben werden:

c har zeichen - ' a ' ; char e h - ' f ' ;

Zeichen werden inte rn d urch Zahlen cod iert; man da rf sich eine Tabelle vorstellen,deren I'liilze hexadezimal durchnumm eriert sind. jeder Tubellenplatz entsp richt ei­nem bestimmten Zeichen, kodiert durch seine Platznummer. Eine char-vartablc spei­chelt inte rn binär mit 16 bits den {/lI icrx!L,-\Vert des zug ewiesenen Zeichens.

Diese Iö-blr-Codierung in Jav a basiert auf Unicode (www.u mcode .org) und erweite rtdeutlich die 7- ode r 8-bit-A\'ClI-Codien mg. während 8hit-ASCII nur 256 (= 2") ver­schiedene Ze ich en darstellen ka nn (wesreuropätsche Sprach en, Lann- L), enthält dieUnicode-Zeichentabe lle Platz für 65536 (= 2" ') Zeich en mit hexadezimalen Unicodesvon OxOOOO bis Oxffff Somit kön nen die Zeichen der meisten Sprach en abgeb ildetwerden - auch nah - und fernöstlicher ode r slawische r Sprachen und zahlreicheSymbole. Die ersten 256 Uö-zetchcn entspreche n den 8-Bih\ SClI-Zeic he n.

Zeichen kö nnen auch in Unicode-Codierung an geben werden, formuliert d urch denPräfix \ u zusam men mit dem vicrstclligcn hexadezimalen Unk-ode-Wert des Zci­chcns: \ u nn nn , also z.B. \uOOa7 für § und \ uOOe l für K Som it k önn en c ha r-­v ariablen di rekt Unicode-Zeichen zugewiesen werde n.

char a = '\uOOa 7 '; // in a steht nun : §

Aufgrund der Kodierung durch lÖbit-Zahlcn stellt der Daten typ char qu as i auch ei­nen Ganzza hltyp dar. So sind mit cns r -Typcn Berech nungen möglich und ein erche r -v ar tablen können nicht nur Zeichen sonde rn auch Zahlenwerte zwischen 0und 65535 zugewiesen werden - jedoch verständlicherweise kein e negativen Werte:

class Zeichen {

publie stat ie void main ( St ring[] a rgs ) {

i nt n "c ' - ' a ' ; // "Re chnen " mit Zeichen

// Zuweisung einer Ganzzahl an char

k = " + k ) ;" n = " + n + "

i nt k = ' a ' ;

System.out .println(

char chl = 78 ;

char ch2 'ß' ;

System.out .p r int l n( "ch l - " + chI + " ch2 - " + ch2) ;

- Kons o le -

k = 97

ch2 = ß

Die Variable n enth ält den Wen 2, da "c ' zwei Plätze vor "a ' in de r lj{~-Tabelle

steht. Die Variable k enthält den Wen 97, da ' k' an diesem L:C-Tabe llen platz steht.Auf L:C-Plarz 78 steht ' N' und wird so mit in de r Variablen eh gespeiche rt.

Page 7: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku 'tJ-f){/lel/1.11X!/1 19

Spezielle Zeic hen sind die sogenannten iscape-sequenren (Tah.5,3 ). Diese werdendurch einen vorgeste llten Backslash gekennzeichnet un d kodieren nic-htdruckbareZe ichen (z.B. Zcilcnumbruch ) oder nic ht d irekt ausgehbare Zeichen (z.B. " oder ' ).

zscaoe-sccuenz Bcdeutunc

I ' Einfache llochkonunara

I " Doooclr cs Hochkommara

\I Backslash

Ib Rückschrittaste

If Seitenvorschub

In Zeile numbruch

I t Tabulator

Ir \X'a~cmikk1allf

Tab. 5.3: Die Escap e-Scqucnzcn

Ja va 5 unterstützt d ie Unicode- Versioll 1.0. Diese enthält zusätzliche, mit 4-Bytc (32­bit) darges te llte Ze ichen (supplemellffll)' characters). Die Zusiilzc bet reffe n spez iellechi nesische und japanische Namens-Zeiche n.

In diversen Paketen lind Klassen des JDK wurden entsprechende Artpassungen vo r­genommen. Der java-Darenryp char bleibt jedoch unabhängig davon mit t ö-btr ko ­dielt. Eine Umstellung von cha r auf 32-bit oder Einführung eines ncucn Datentypschar32 wären inkompat ibel zu best eh enden .IV1\1s un d Anwendungen und wü rdenden Speicherbedarf zur Zeichendarstellu ng verdoppel n. f ür Details zu dieser Thema­tik verweisen wir au f [SUN05bl (Stichwort: nuernauonattzouon - Supplemcntarycbaractera.

5.1.4 Wahrheitswerte (Boolesche Variablen)

Für die booteseben w abrhctrswcrrc wahr und fals ch verfügt Java üb er den eigen­stä ndigen Datentyp b oo l e a n . Diese r umfasst nur die beiden vordefinierten Kon­sranrcn true und false. Einer Variablen vo m Typ boolean könne n somit nu r die\X'e lte t r u e lind false zugewiesen werden, nicht aber Zah len oder Zeichen. DiebooLean-Wcrtc t rue un d f a l se werden nicht durch die Zahle n 0 und 1 rc prä­sc ruic rt (wie z.B. in C + +), sondern sind clgensrä nchgcn Typs.

Einsatzgebier des Datentyps boolean sind Bedingungsprüfunge n (in i f else­Verzweigungen und Schlc jfcn) und Vergl eiche (rclationalc Operationen ). Deren Er­gebnis ist ein Wahrhcnswert , den man einer b oo Le an-Var iablc zuweisen kan n. ImBcispiclcodmg träg t die Variable q schließlich den Wert true, die Variable p denWer l fa lse. Diese w erte werden auf der Ko nso le ausgegeben:

c l ass Wahrheit {

pub l ic s tat ic voi d main ( String [ ] args ) 1

boolean p ,q ;

int x = 1 0 , y = 20 ;

Page 8: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

50 5 [at '(I -Datentypen

p true ;

q x < Y'

if ( Y , x I p = falsa ;

// Vergleich liefert true

1/ Zuweisung des Wertes false

Sy s t em, out . prLn t Ln ( " q " + q + " und p '" " + p ) ;

- Kons o l e -

true und p = fal se

Im Zusammenhang mit Bedingungsprüfungen un d vergle fchsope rattonen wird derGebrauch des Date ntyps b oo Le an nochmals e rö rte rt werden.

5.2 StringsFür Zeichenlectten steht in Java tect n vordefinierter primi ihrer Datentyp zur Verfü ­gung. Dennoch lässt sich in Java einfach mit Strings programmieren, da mit dem au ­to mat isch importierten Paket java .lang die K/asse St r i ng stet s direk t verwend etwe rden ka nn - fast so, a ls ha nd ele es sich bei String um eine n primitiven 1);11(: 11­ryp. Strings können wie primitive Dan...n typen deklariert und initialis jc rt werden.\X' ird auf der Konsole ein primitiver Datentyp mittels System . ou t . print l n ( )ausgegeben, da nn wird dessen \Ve J1 automatisch nach String konvertiert.

Mit dem St r Lnq- spczitlschcn Ver/..'Jl{ipjifllp,S-O{JC/"(ifor + könne n zeichenketten an­e inan dergeh än gt (ko nkarcnn-rr) werden. Wird du rch den Operator + ein Stringun d ein anderer Datentyp verknüpft, so wird automatisch nac h String konvertiert,d.h. da s Resultat de r v crknüpfun g ist wieder vo m Typ String. Dabe i ist jedoc h dieReihenfolge der Ausführung Cvon links nac h rechts") zu beachten:

olass Zeiohenketten I

pub l i c s t a t i c void main ( String[ ] args ) {

d - 10 + 10 + " Alter - " + 30 . 5 ;

String a ;

a .. " Ha l l o " ;

"Du da !" ;

Initialisierung

Deklaration + Initialisierung

" als StringLeerzeichen

// Deklaration

11

11

11+ b ;- a +String c

String

String b

// Escape-Sequenzen können eingebaut werden :

String e - " Ei n String , über \n zwei Zeilen ve rteilt . " ;

Sy s t em . o ut . p r i n t l n ( " I nh a l t von c + c I ,

System.out .print1n( " I nh a l t von d + d I ,

System.out .print1n( " I nh a l t von e + e I ,

Page 9: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku 'tJ-f){/lel/1.11X!/1 5 1

- Konsole -

von c - Ha l lo Du da !Inhalt

Inhalt von d 20 Alter = 30 .5

Inhalt von e - Ein String , über

zwei Zeilen verteilt .

St r Inq-Lttcrale dürfen sich nicht über mehrere Zeilen erstrec ke n + U111 ei nen langenSt r i ng zu forme n, muss mit Teilst ring s lind dem Operato r + gearbeitet werden . InStrings können uscape-Scquenzen zur Ausgabesteuerung eingebaut werden. AuchSt r i ng-Variablen sind vor ihre r Verwendung zu deklarieren un d zu inirialis ieren.

Bd St r ings han delt es um Obj ekte der Klasse String, die auch umfangreicheMethoden zur Stnngma nipulation enthält . Der Klasse String we rden wir uns späterau f Basis objektorientierte r Kennmisse erneut zuwe nde n . Einstweilen gehen wir mitStrings um wie mit primit iven Standarddatentypen.

5.3 Zusammenfassung Standard·DalenlypenIn Tabelle 5.4 sind alle Standardt ypen zusammengefasst. \X'iih rend in C/C++ dieLänge elementarer Datentypen von Plattfo rm zu Plattform variiere n kann , sin d in Ja­va d ie Eigenschaften aller Standardtypen planfonmmabhängtg festgelegt. Auch dies

Cl 11 f · I· 1'1 f 11· k I PIsl c mc .runc a zc ur <- rc an ormu na } ranu eil vo n ava- ro '1":.1111111en.

Darenrvn wertervn Bltlänee Wertcbereich

by t e Ga nzzahl 8 -12B his +127

short Ganzzahl 16 +3276H bis + 32767

Int Ganzzahl 32 -2147483648 bis +2147483647

l ong Ga nzzahl 64 -92233720368 54775808 bis+9223372036854775807

float Flic8komma ,2 "" -2·10'" bis +2·10'"

d oubl e Hießkomma 64 "" -2 · 1O~" bis +2·10' "

char Ce-Zeic hen 16 c C: ' \ uOOOO' bis ' \ u f f f f '

b o o lean Wahrheitswert 8 truc I false

Tab . 5.4: Die Standarddatentypen der Sprache Java

Möch te man mit se hr grogcn Zahle n bzw. grölk'rer Gena uigkeit rechn en als es de rDatentyp double erlaubt, kann man auf die spez idien Klasse n Bi g l n t e g e r undBigDecimal zurückgreifen (Kapitel 19).

Neben vo rdefinie rten primitiven Date ntypen existieren juva d ie sogenannten Kefe­1Y!I/Z~t1)(>!I , deren Eigenschaften sich von Variablen der ei nfac hen Standard­Date ntypen de utlich untersehe.. idcn. Nach der Einführung des Klassenkonzepts ge ­hen wir darau f in Kapitel 11 se hr detailliert ein.

Page 10: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

52

5.4 Konstanten

5 [at '(I -Datentypen

In einem Programm werden nicht nu r Variablen benötigt , d ie ihren \X'crt verändernkönnen, sond ern auch KONstanten , d ie im gesamten Programm ihren anfänglichenWert beibehalten. Um symbolische Konstanten mit festen Namen und Wert zu ver­e inbaren, d ient in Java das Schlüsselwort final , das bei Deklaratio n der Ko nstan tenvor der Typ- un d Name nsangabe erschei nt.

Ind em mal) Konstanten an eil/er Stelle des Programms auffüh rt, e rhö ht man die !.es­harleeit und War/hmi'f.'ü des Prog ramms: Statt de nselben Wert an vielen Positionen"hart" ins Coding zu schreiben, finde n sich De klaration un d lnitlalis ic rung der Ko n­stanten an ein er be stimmte n Stelle . ,\!tISS deren Wert geände rt werden , so ist nu r aneiner einzige n zent rale n Codingsrclle ei n Eingriff nötig, nicht aber an versch iedene n,über da s Programm verstreuten O rten.

Konstanten können alle ge nan nten Datentypen sein. Auch Konstanten müs sen \/01'

ihre r Verwend ung deklariert und tntnaltstcrt werden. Beides kan n in einer Anwei­sung erfolgen Osl au s Grü nden der Lesbarkeit auch sinnvoll), jedoch darf die Initiale\X'<.'rtzuweisung auch späte r erfolgen . D<'T Co mpiler achtet darauf, dass Ko nstan tensich wirk lich konstant ve rhallen , d.h. nur ei n mal mit ein em endgü ltigen Wert beleglwerden - und sich d iese r \'\'e lt im Programm nicht ve rändert. Konstanten dürfe n ih ­rcn Wert nach einmalige r lnit ialislcrung nich t mehr verändern. Jedoch darf der Werteiner Konsumren auch erst zur Laufzeit zugewiesen werden, z.B. durch Eingab e desBenutz crs.

Das Belspielprogramm berechnet die Kapitale ntwicklung vo n 1000 GE über drei Jah­re hinweg mit e ine m konsta nte Zinssatz von 5% un d gibt das Ergebnis au s:

c lass Zinsen (

publie statie void main ( String[] args ) {

f i na l double z i n s = 0. 05; 11 Konstante zins

double kapital - 1000 ,0 ;

kapital kapital * (1 + zins) ;

ka p i t a l kapital * (1 + zins) ;

kapital kapital * (1 + zins) ;

Sys t emvout v p r i nt.Ln t " End ka p i t a l " + kapital) ;

Die Ausgabe lautet: Endkapaital = 1157 .625

w ährend der w ert der Ko nstant en zins unve r ändert bleibt , ve rändert sich de r Wender Variabl ..: n kapital ständig. Durch Kennzeichnung vo n zins als final wirddie Bedeutung diese r GröBl' im Programmko ntex t klarer - lind Irrtümliche Verände­rungen sind ausgeschlossen. Gerade in größeren Projek ten ist dies vo n Bedeutung.

Page 11: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku -a-natentypen 53

5.5 Zuweisungen zwischen verschiedenen DalenlypenBei Deklaration einer Variablen ode r Konstanten muss ih r Datentyp deklariert w er­den. Somit kann de r Compiler prüfen , oh Wertzuweisungen mit ihrem Datentyp ver­träglich sind · oder ab er mit Datenverlu sten bzw. Wertverfälschungen ve rbundenwären . Grun dsätzlich erlaubt der Compiler nur solche Zuweisungen , bei de nen sol­che Proble me nicht auftreten kö nnen , die also typsicher sind.

Bet eine r XlIlI'eiSI/ IIJ,i wird der w ert des Ausdrucks rechts vo m Gleichhei tsze iche nder lillks ste he nden Variabl e n zugewiesen , d .h . in dieser gespeiche rt:

int x - 1 0 ; int y - 20 ;

x = y + 1; x = x + 1; x = y ;

Allerdings sind Zuweisungen nur erlaub t, wenn die Datentypen auf beiden Seitender Gleichung ZIl Il'eiSI/ IIRS~,(JJlIJ)(llilx" U)'jJko /JIjJati be[) sind - wenn meh r, so meldetde r Comp iler e ine n Fehler. Es handelt s ich um eine statische 7Jwwiijilllg zur Com­pilezeit , durch d ie w crtverfälschungcn zur Laufzeit vernucdc n we rde n.

Prinzipiell unproblematisch sind natürlich Zuweisungen mit gc nau passendem, d.h .gleiche m Datentyp Beisp ielsweise Lnt-Zahk-nlireral (Zahl, \'('en ) ode r -vartablc aneine t nt-v ariable. doub Le-Wcrt ode r -Vartablc an eine doub l e-Var iublc ctc.:

i n t n = 10 ; i n t k = n + 20 ;

d = b + 4 .456 ;double d = 13 .5 ;

cha r ch Lr

double b

char ch2

19 .34 ;

' F ' ; eh I ch2 ;

Die ve rschiede ne n elementaren Datentypen stehe n auch in einer IJ1JkollljJat ihilitiits­Heziehllllg zueinande r: Jede r Datentyp ist vorstellbar als unt ersch iedlich groscrWert bchäher. der unt erschiedlich groge Werte (im Falle double Lind float: auc hmit umcrschicdlk-hcr Gen auigke it) aufn ehmen kann. Bildlich gesprochen kann dertlcinere Behälter in den gn:j.0ren ge pack t we rden, nicht aber umgek ehrt. Die Gröf3;:des Datenbeh ältc rs ist d urch die Zahl der Bits des Datentyps gegebe n aber auchdurch die inlerne Zahkndarstdlung.

Zuw eisungen sind er laubt, wenn der Typ der linken Seite mit dem Typ derrechte n Seite g<:miH~ 1)1J('om/mtibilitiits -lieziehllllR, ve rt räg lich ist .

So kan n eine Lnt-Vuriable ste ts eine r Variablen vom grörscrcn Datentyp d o ubl ezugewiesen werden, da de r Compiler beispielswe ise aus der i.n t-Zah l 5 d ie doub ­le-Zahl 5.0d erzeuge n kann. Zudem ist der w ertebcretch des Typs int im w erte­bc retch des Typs double enthalten, so dass es nicht zu Bereichsüberschreitungenko mmen kann . Eine so lche Zuweisung vorn kleineren zum gröf~ren Datentyp wirddurch den Compiler mit e ine r automattseben (i mpliziten) Typtsonr enientug bewerk­srelligr.

Dies gilt n icht in um gekehrter Rich tung: Aus dem double-Wen .~ . 78 kann nu rdurch w errverfälschung (Abschneide n Konnnasrellen ) ein Lrrt-w ert ge macht wer­den. Zudem kö nnte sich in eine r d oub l e-Variablen ein Wert befinden. de r den Zah ­lenbercich einer än t -v artablcn sprengt, d .h. gröfkr ist als 2147483647. In Abbildung5.1 sind d ie Typvcrrräglich kcncn ve rde utlicht. Durch das Symbol ;:) Hisst sich dieTypkompatibilität formulieren als:

Page 12: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

51 5 [at -a-Datentypen

double ~ f l oat ~ l ong ~ int ~ sho r t / cha r ~ byte

Alle Zuweisungen in de r Rtchtung byte ~ double w erden akzeptiert und bew ir­ken automat ische implizi te Typkon vcrt ierungen , alle Zuweisungen in Richtungdouble ~ b y t e werden jedoch vom Compiler Zl/1iickgeU'iesell , Ja prinzipiellWertverfälschungen b zw. Bereichsüberläufe auft re ten k önnten .

doub le

Boalong

intsho rt char

9Slrings s ind kein

<:k-nK"lll~rcr Isurcnryp !

Abb. 5.1: 'I'ypkompaob illräts-Bcztchung der Standard-Datentypen von Java

Somit werden fo lgen de n Zuweisungen vo m Co mpiler akz eptiert:

doub le d ; float f ; long m;

iot n 1 0 ; short s . 20 ;

11 Ok vom kleineren zum größeren Beh ä Lt.e r :

d n , 11 von iot nach double

f n + 100 ; 11 von lot nach float

m n + s s 11 von int und shart nach long

n -, + 30 ; 11 von shart nach änt

d m + n + s s 11 von long , int und short nach double

Dagegen reagiere n Java-Co mpiler au f die folgenden Zuweisu ngen mit Fehlermel­dungen der Art 7)1:Je mismatcb. cannot conren ode r toss ofprcctston:

int n ; short s ; byte b ;

double d = 3 .1 ; float f lo Sf ; long m = 200L;

1/ Fehler - vom größeren zum kleineren Behälter :

n = d ; n = f ; n = m; s = n ; m = d ; f

/1 Fehler Oberschreitung des Wertebereichs :

s = 100000 ; b = 800 ;

Möglicherw eise ko mmen auf de r rechten Zuwe tsungsse tre in Berechnungen ver­schiede ne Datentypen vor. Bei e ine r Mischung von Datentype n in Ausdrücken wen­de r Java folgende Typregel zur Typangle tchung an:

Page 13: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku -a-natentypen 55

Der "kleine re" Operandentyp wird vor Ausführung der Rechenoperation inden "grö lk re n" konvertiert. Der berechnete Ausdruck bek ommt dan n dengleichen Ty p wie sein e Operanden - z u mindest aherdt:n Ty p .i. n t .

byte gibt int, passt nicht in byte b3!

b3 ;

short s3 ;short s2 - 200 ;

main ( String[] args )1

byte b2 = 10 ; bytebyte b1 = 55 ;

short sI - 1 00 ;

I/Fehler : byte +

b3 = b1 + b2 ;

IIFehler : short + short gibt int, passt nicht in short s3!

So ergibt d ie Summe von f Lce t- und .i n t -Variablc oder -Zahl ein Ergebnis vomTyp float, das Produ kt von double lind byte ein doub Le-Ergchnis, die Diffe­rcnz zwische n long un d int e in Lonq-Ergc bnis ctc. Das Ergebnis de r Ope ratio niSI aber mindestens vo m Typ int!! Beim Arbeiten mit byt.e- lind shor t-Darcnkann dies zu lI"'Ual iOl I(>II füh ren: Man muss die ses Vorgehen des Compilers kenn en ,un i zu ve rste he n, warum das folgende (einfache Programm nicht kompiliert, sondernmit e iner 7)1X' mislI1alcb-fehlcl"lndduog zurückgewiesen wird,

c l ass Typregeln {

public static void

s3 = sI + s2 ;

Hier hilf! ei ne explizite Typkonvemerun g (s.u.) weiter.

Wich tig: Nicht alle impliziten Tvpkonverncrungen sind ohne Inform.utonsvertusrdurchführbar. Bei der Umwandlung grorscr Ln t-Wcrtc nac h f Loa t sowie bei de rUmwandlung grof.kr 100g-\Ve11en nac h float oder double kan n es wegen deran de rsartigen internen Darstellung von Hießkonuuarypcn zu w crtve rfälschungcnkommen:

int n 123456789 ; 10ng m = 9223372036854775807L ;

float f = n ; 11 in f steht : 1 .234567 92E8

double d - m; /1 in d steht : 9 .223372036854 77 6E18

5.6 Explizite Typkonvertierungen (Casts)Durch sogenannte 1)1Je ClIsts kann man sich über die Typregeln des Compilers hin­wegserzen. Durch Casrcn wird eine explizite Tvpko nvc rt tcrung erzwunge n . Zum Ca­srcn wird der gewünschte Zicldarcnryp in runde n Klammern vo r die zu castende Va­riab le bzw. den zu castenden Wen geschrieben - es wird e in Castoperator (typ)

au f eine Variable hz w. einen w ert ange wa ndt.

int n ; short k ; double d = 3 .456 ;

n '" (int ) d ;

k (short ) 6 . 45 6f ;

11 Cast von double nach lnt

I/ Cast von float nach short

Page 14: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

56 5 [at '(I -Datentypen

Dabei ändern sich Typ un d Welt der gccusrcr cn Variab len nicht; vielmehr wird deraktue lle Wert gelesen, gemii8 Cast umgewandelt und der umgewan delt e Wert derVariablen auf der linken Seile zuge wiesen.

Alle rdings trägt nun der Entwickler d ie Verantwortung für Sinn lind Resu ltat de r e r­zwungcncn Znwcisungsopcration. Castcn bedeutet, klüger se in zu wollen als derCo mpiler. Dies birgt stet s die Gefahr des Dan-nverlustes oder der w ertv erfälschuna,da folgende Regelll 1)(';111 ClisteJl vom grögcrcn zum kleineren Datentyp geltcn :

• Nicht im Typ der linken z uwetsungssctte unterbringbare Bits des gecasreren\X'ert s werden abgeschnitten! (So Hisst sich z.B. aus einem 64bit long nur durch\X'egfall vo n 56 h its ein Bbit byte gcwfnnen.) Dies bedeutet konkret :

• Alle Kommastellen gehen verloren beim ("..;lS1 von Fließkommatype n (d oubl e ,f Loe t ) zu Ganzzahlt ypen.

• Übe rstehe nde Kommastelle n und somit Ccnautgkc ft gehen verloren beim Castvo n double nach float.

• w env crändcruo gcn kö nnen beim Castcn gro scr Zahlenwerte result ieren.

Dies ze igen folgende Beispiele:

class CastRisiko (

public static void main ( String[] args ) {

double d = 3 .456 ;

int n = (i n t l d ; 11 Abschneiden Kommasteilen!

System.out .printl n( "We r t n = " + n ) ;

long m l29L ;

byte b (byte) m; 11 Von 64 bit "mi t Gewalt " nach 8 bit!

System.out .println( "We r t b - " + b ) ;

11 Mit Cast kompiliert nun allerdings auch :

byte bl - 55 ;

short sI = 100 ;

byte b2 - 10 ;

short s2 = 200 ;

byte b3 ;

short s3 ;

b3 (byte) (b I + b2) ;

s3 (short) (sI + s2) ;

- Konsole -

3

-127

Der Entwick ler muss sich also frage n, ob diese Resultate wirk lich intend iert sind.

Zwischen dem Darcnryp boolean un d anderen Datent ypen kan n nicht gccasrc twerden. Die boo.Leen-Wertc true und false ge hören in Java zu eine m el/{ell ­ständigen Datentyp . der nicht in andere Datentypen umgewandelt oder aus Wertenanderer Datentypen erzeugt werden kann. Natü rlich ka nn auch nicht zwischen

Page 15: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5 ku -a-natentypen 5 7

Str ing und primitiven Da tentypen gecasrer w erden , da Str ing gar kei n primiti­ver Datentyp ist .

Die Cast-Operation ist a uch a nwendbar be i Zuweisunge n zwische n Objektva riable n(Rcfc rc nztypcn) und wird uns im Zusammenhang mil den fo rtgesc hrittene n ThemenVe re rb un g lind Polymorphie wieder be sc häftige n .

5.7 Eigenheiten und Fallen beim Arbeiten mit StandarddalentypenBeim Operieren mit Gan zzahl- und Fließkommatypen sind einige ele men tare Regelnzu beachten, um be i Be rechnungen ko rrekte Resultate zu e rhalten.

Rech nen m it Ganzzahlern

Divisionen von Ganzzahlen werden nur m it ganzzabttger Creluill igkeil durc-hge führt .Ja va schne idet bei Ganzzahldivisione n alle Kommastellen (ohne Rund ung ) ein fachab , um eine Ganzzahl zu erhalten, z.B.:

int x = 1/2 ;

i n t y "" - 3/2 ;

11 in x steht O!

11 in y steht -I!

11 in b steht nun -128!

Ganzzahlenbereiche sind quasi zu e inem Ring geschlosse n - es g ib t keine Überlauf­Fehlermeldungen oder r'rog rammabbrüchc . wenn sich lx-I Rechn ungen Bereichs­übcrschrcnungcn ergebe n . Wird d ie positive Bereichsgrenze überschritten, so begibtman steh ans Ende des negativen Bereichs, z.B.:

byt e b = 127 ;

b = (byt e) (b + 1 ) ;

b = 12 0 ;

f o r t int i=l ; i<=10 ; i ++ ) b ++; Ilin b steht nun -126!

Bctm Rechn en mit byt e- und s ho r t -Var iablcn konvertiert Java au to matisch zu int( s.o.), z.B.:

byte a = 5 ; b yte b = 10 ;

11 byte c = a + b ; Fehler Typ von (a + b) ist int! Casten :

by te c - (b yt e) (a+ b) ; I I Ok !

Rec h nen m it Flicßkomma7.ahlcn:

1)<.']" Typ e ine r Flid~kommazah l in Java ist dcfaufrm äßig double. So wird 1.0 auchohne Suffix d ode r D als d oub l e gesehe n, abe r 1 . Of iSI von Typ f loa t . Dies lie­fert Fehler bei ungenau formulierten Zuweisungen an f loat-Grüßc n , z.B.:

f l o a t f - 1 + 3 .14 ; 11 Fehler - Ergebnis ist vom Typ double!

f = 1 + 3 .1 4f ; 11 OK Typ der rechten Seite ist float!

doub le d "" 1 + 3 . 14 ; 11 OK Typ der rechten Seite ist double!

Die Ganzzahlgena uigkeit bei der lurtston 1'01 1 Ganzrabten wirkt sich auch bei derZuwe isung zu Fhcgkommarypcn au s. Zuniichst wird der Ausdruck der rechten Seiteberechnet , dann e rst wird da s Resultat even tuel l einer für die Zuweisung c rfo rdcrll­eben automatischen Typkonvcntcrun g un te rzog en, z.B.:

double d - 1/2 ; 11 In d steht O.Od! (l und 2 sind int-Zahlen)

Page 16: Java-Datentypen · 2018. 10. 12. · 5 Java-Datentypen Es ist ein Kennzeichen "guter" Programmk-rsprachcn, den Entwickler zu zwingen, jede Variable und Konstante nicht nur mit ihrem

5H 5 [at '(I -Datentypen

d 1. 0 / 2 ; 11 In d steht O.5d (1. 0 ist double-Zahl)

d (doub le) 1 /2 ; 11 In d steht Q.5d (Cast von int 1 zu double)

d 0 .8 + 1/2 , 11 In d steht O.8d! (Denn 1/2 lieferte O! 1

Pltcakommaberechnungen sind prinzip iell ungenau. So können beispielsweise nega­tive Zeh nerpotenzen (0.1 , 0.02 etc.) mit float ode r doub le nicht exakt dargestelltw erden [BL004]:

d oubl e d ~ 1 .03 - 0 . 42 ; // in d steht 0 .6100000000000001 1!

Somi t sind Plierekommatypen im Grunde fü r monetäre Berechnungen ungeeign et.Stattdesse n sollten i n t oder lon g verwendet Lind die Kommastellen Intern selbstverwaltet werden (d.h . in Cent rechnen stau in Euro) , Uni unse re Beispielprogram­mc einfac h und übersichtlich zu halten , se tze n wir uns jedoch darüber hinweg .

5.8 NamensgebungEinhahung der folge nde n Konventionen erhöht die Lesharkeil des Programmcodes.

• Variablen und Ko nstanten sollte n sprechende Namen e rhalten, die ihre Bedeu ­tung im Progranunkonrexr ausdrücken.

• Variab lenna men beginnen mit Kleinbuchstaben, z.B.: zi ns , kapi ta l.

• In zusammengeserzrc n Variablenname n schreibt man nac hfolgende Wortanfängegroß, z.B.: anfangsKapi ta l.

• Konstantennamen bestehen aus Grosbuchsraben . LB.: MIN IMUM.

• Zusammengesetzte Konstantennamen werden durch Unte rstriche _ ve rbunden,z.B.: MAX VALUE.

• I Iilfsvariablcn so llten ehe r mit kurzen Namen belegt werden, z.B.: L, j .

• Trotz Unicode sollten mit Rücksicht auf internatio nale Vcrstiin dlk-hkcit eetne na­tionalcn Sond erzeichen (z.B. Umlaute) ve rwende t werden.

• Be i Deklaration sollten wichtige Variablen und Konstanten ko mmentie rt werden,um ihre Bedeutung im weiteren Programmkontex t zu dokumentieren.

ln d iesem Kapitel haben wir bereits in den Be ispielen mit Add itionen ( + ) und Divi­sion en (f) von Variab len und w erten gearbe ite t. Im folgende n Kapitel wollen wiruns nu n eine n vollst ändigen Überblick über die in die Sprache Jav a eingebauten 0 ­pcratoren und ihre wirkungswcisc ve rschaffen.