Kurt Nørmark ©
Department of Computer Science, Aalborg University, Denmark
September 2001
Abstract Previous lecture Next lecture Index References Contents | I denne lektion vil vi studere de dele af Java, som ikke er snævert forbundet med objekt-orienteret programmering. Dette er primitive datatyper, erklæringer, kommandoer, kontrolstrukturer, udtryk, operatorer, herunder operator prioriteringer. Vi ser også på simpel input og output. |
Datatyper i Java |
Primitive Datatyper i Java: taltyper Slide Note Contents Index References Speak | Vi starter med at studere de datatyper, som kan bruges umiddelbart i ethvert Java program. Vi kalder dem primitive i modsætning til typer baseret på klasser, som vi er meget optaget af i forbindelse med objekt-orienteret programmering |
|
Det er værd at bemærke at alle heltal og reelle tal har en fast størrelse på tværs af platformene, hvor Java er implementeret. Eksempelvis er int typen 32 bits heltal både på Unix og Mac. Heltal af typen long noteres med et efterstillet 'L'. Eksempelvis er 123L altså tallet 123 som en long. Hvis det efterstillede 'L' ikke forekommer er der tale om en værdi i int. Java tillader os at notere heltal i basis 8 (oktal), 10 (decimal) og 16 (hexadecimal). Et foranstillet '0' angiver oktal basis, og et foranstillet '0X' angiver hexademinal basis. Eksempelvis er tallet 011 altså lig med 9 (decimalt), og tallet 0X11 er lig med 17 (decimalt). Oktal og hexadecimal notation er praktisk hvis man arbejder direkte med bit, idet et oktalt eller hexadecimalt tal direkte kan transformeres til binær repræsentation ved ciffervis konvertering. (Dette er meget mere besværligt at konvertere et decimalt tal til binær repræsentation). Man kan observere, at Java understøtter regning med heltal af vilkårlig stor præcision via klassen BigInteger - jf. referencen fra denne side. Typerne double og float har samme leksikalske syntaks. Som eksempler kan nævnes
Hvis ikke andet angives er tallet en double (default). Hvis man ønsker at notere et tal af typen float skal man afslutte tallet med et f. Så følgende er eksempler på værdier i typen float:
Symmetrisk kan man også angive et d tilsidst - d for double. Men det er altså ikke nødvendigt |
|
Program: Et Java program som erklærer to int, tre long og en float variabel.
Programmet udskriver tallene 10, 18, 9, 17, 2748 og
3100.0 |
|
Primitive Datatyper i Java: boolean og tegn Slide Note Contents Index References Speak |
Der er kun direkte og naturlig notation for en delmængde af de første 128 tegn i Unicode alfabetet. Denne naturlige notation udgøres af symboler i fonte. På inputsiden spiller tastaturets udformning naturligvis også en rolle. De første 128 tegn i Unicode alfabetet er sammenfaldende med det velkendte, basale ASCII alfabet (det udvidere ASCII alfabet udgøres - som bekendt - af 256 tegn). Som i andre sprog i C-familien virker escape tegnene \b, \t, \n, , \f og \r for tegnene hhv. 8, 9, 10, 12, og 13 i ASCII tegnsættet. Endvidere kan man benyttet backslash tegnet for at kunne notere quote tegnene og backslash selv:\', \", \\. De første 256 tegn kan noteres som \abc, hvor a, b og c er octale cifre (a dog kun 0-3). Endelig kan et vilkårligt tegn i det store unicode tegnsæt noteres som \uxxxx, hvor x er et hexadecimalt ciffer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e eller f. Herunder er der et antal referencer til Java Sprogspecifikationen, som giver alle detaljer om tegn i Java. |
|
Klasser som repræsenterer primitive typer Slide Note Contents Index References Speak |
|
|
Program: En klasse som repræsenterer en brøk ved brug af BigInteger objekter.
Et sådant objekt er også kendt som et rationelt tal.
Vi interesserer os her og nu for BigInteger operationerne i klassen.
|
|
Exercise 3.1. Klassen Brøk | Programmer videre på klassen Broek, som vi har startet på ovenfor. Programmer som et minimum de aritmetiske operationer add, subtract, multiply og divide. Programmer også gerne andre relevante operationer, såsom equals, less-than, osv. Hvis du laver equals metoden bør du erindre mønstret fra en tidligere lektion. |
Sammensatte datatyper i Java: Arrays Slide Note Contents Index References Speak | Det er naturligt at spørge, hvordan Java håndterer sammensatte datatyper - altså datastrukturer. Som en vigtig del af 'sædvanlige' programmeringsprog findes der forskellige datastrukturer, såsom arrays, records, sets, mv. I Java bliver alle typer, som svarer til sådanne datastrukturer, realiseret som abstrakte datatyper, og implementeret som klasser. |
|
I array eksemplet er tabel et objekt, som instantieres på en særlig array-specifik måde. Det første element i et array har altid indeks 0. Ovenstående eksempel svarer til Pascal erklæringen:
I mange sammenhænge vil en Java programmør bruge andre typer end Array, hvis man ønsker at at arbejde med samlinger af data. Java understøtter et Collection begreb, som er på et langt højere abstraktionsniveau end arrays. Mere om dette i en senere lektion. |
Ofte opfattes strenge som en særlig type af arrays. I Java er strenge objekter af typen String. Dog er der ligesom ved arrays særlig sproglig understøttelse af strings i Java. I en senere lektion ser vi nærmere på strenge i java. |
|
Sammensatte datatyper i Java: Records Slide Note Contents Index References Speak | I forlængelse af forrige side ser vi her på recordbegrebet. |
|
|
|
Erklæringer i Java Slide Note Contents Index References Speak | Erklæringer i Java er specielle på flere områder i forhold til Pascal. Vi ser nu nærmere på dette |
The concept erklæring: I en erklæring introduceres et navn, samt en række egenskaber af et navn | I nogle programmeringssprog er det ikke nødvendigt at introducere et navn via en erklæring. Man kan blot bruge det. Java er dog ikke et sådant sprog. Ligesom i Pascal, skal vi erklære et navn før vi kan bruge det. Man kan for eksempel ikke blot assigne til en variabel uden først at have introduceret variablen i en erklæring. |
Syntax: Efter typen angives en liste af komma separerede variabelnavne. Hvert af disse navne erklæres til at være af den angivne type |
|
Syntax: Som en variation er det muligt at angive udtryk, der beregnes til variablenes startværdier |
|
Variabel og konstanterklæringer i Java Slide Note Contents Index References Speak | I forlængelse af forrige side ser vi videre på variabel og konstant erklæringer i Java |
|
Program: Et Java program med forskellige erklæringer.
I programmet ser vi en erklæring af en 'konstant' PI og en heltals variabel a.
Både PI og a er i realiteten at betragte som globale variable. Hvorfor dette er tilfældet
vil vi først indse, når vi har studeret statiske klasseegenskaber senere på kurset.
I proceduren main erklæres de lokale variable aNumber samt a og b. Dette er lokale
variable i proceduren main. Bemærk, at erklæringer
kan blandes med kommandoerne (de to println kommandoer) i proceduren; Og bemærk
at a er redefineret i main. De sædvanlige scoperegler er gældende, således at
indre (mere lokale) definioner overskygger ydre (mere globale) definitioner. Output fra programmet
er pi er 3.14159 og videre aNumber = 6.28318 og a = 6 |
|
Hvad med enumeration types i Java? Slide Note Contents Index References Speak | En Pascal programmør gør ofte god brug af de såkaldte enumeration types. Vi opfrisker her hvad dette dækker over, og vi ser på hvordan man begår sig i Java, hvis man skulle have lyst til at lave en enumeration type. |
|
Program: Et Pascal program der illustrerer brugen af enumeration types.
Programmet - som har været benyttet på datalogikurset på basisuddannelsen - konverterer fra 13 skala karakterer til bestået ikke bestået. |
|
Program: Et tilsvarende Java program.
Vi ser for det første, at vi ikke definerer nye typer i Java. Den eneste måde vi kan lave typer på i Java er gennem klassedefinitioner.
Det vil kunne lade sig gøre at definere en Karakter klasse hvorpå der laves en ordning, men det vil nok i simple tilfælde være et 'overkill'.
Vi laver en mængde af konstanter, hvis værdier er naturlige tal. I bund og grund er enumeration konstanterne blot symbolske navne
for udvalgte heltal. Den naturlige ordning på tallene giver en ordning på karaktererne. I Pascal programmet kan man checke grænser automatisk.
Dette kan ikke lade sig gøre i Java programmet, idet alle operationer arbejder på typen int, og ikke simpel_karakter eller tal_karakter.
Det betyder i praksis at vi burde checke eksplicit i de to procedurer om parametrene giver mening. (Dette har vi ikke gjort her, fordi vi er lidt dovne,
og fordi vi ønsker at holde programmerne så sammenlignelige som muligt overfladisk set). |
|
Leksikalske regler i Java |
Leksikalske regler Slide Note Contents Index References Speak | Tillægsordet 'leksikalsk' benyttes til at tale om egenskaber, som vedrører enkelte ord (i modsætning til egenskaber ved sætningsopbygning mv.) I vores sammenhæng benyttes betegnelsen til at studere regler og begrænsninger for, hvordan ord i Java kan sammensættes af tegn fra Unicode alfabetet (tegnsættet). |
Disse regler betyder bl.a., at vi ikke kan have navne, hvori der indgår specialtegn, såsom bindestreg ('-'), spørgsmålstegn eller udråbstegn. Forskellen på små og store bogstaver i Java navne betyder f.eks. at navnene bankkonto , Bankkonto og BANKKONTO alle er forskellige navne i Java Langt de fleste moderne programmeringssprog tillader vilkårligt lange navne, og således også Java. Det er som regel vigtigere at vælge et godt og sigende navn for variable, klasse og metoder, end det er at tilstræbe kompakthed via korte navne. |
At danske tegn kan benyttes i Java navne skal tilskrives Java's understøttelse af Unicode alfabetet. Hvis man vælger at 'skrive Java på dansk', er muligheden for anvendelse af danske tegn i navne en meget tilfredsstillende leksikalsk udvikling. I de fleste andre programmeringssprog kan navne kun indeholde tegn fra det basale ASCII alfabet (128 tegn). Man kan også anvende udenlandske specialtegn, f.eks. græske bogstaver, som er populær blandt matematikere. Man vil dog typisk støde på problemer i editorer, som ikke kan vise disse tegn. Endvidere kan det være akavet at indtaste sådanne fremmede tegn via et 'standard tastatur'. |
Leksikalske konventioner Slide Note Contents Index References Speak | Her vil vi opremse en række nyttige konventioner for dannelse af forskellige slags
navne i Java programmerne.
Konventionerne er anbefalinger som ikke påtvinges via checks af Java oversætteren. Vi refererer herunder til en 'Java programmerings standard' af Doug Lea, som går meget videre end vi gør her. Denne kan anbefales som god læsning, hvis man ønsker at skrive konsistente og forudsigelige Java programmer |
Det er et spørgsmål om smag og behag, om man adskiller ord i lange navne med understregningstegnet eller om hvert ord starter med stort. Jeg fortrækker selv sidstnævnte konvention |
Som allerede omtalt, er navnene pip , Pip , pIp og, PIP alle forskellige i Java. Anbefalingen er her kun at benytte ét af disse navne i et Java program. På denne måde undgår man unødig forvirring hos programmører, som ikke er 100% bekendt med de leksikalske regler i Java. |
|
Kommandoer i Java |
Kommandoer - generelt og i Java Slide Note Contents Index References Speak | I imperative programmeringssprog er kommandoerne af primær betydning. Det er gennem kommandoerne at handlingerne sker. Vi giver her en generel oversigt og klassificering af kommandoer i et imperativt sprog. |
|
Syntax: Variablen på venstre side tilskrives værdien af udtrykket på højre side. Som kommando, skal et assignment altid efterfølges af et semikolon |
|
I Java har man valgt syntaksen variabel = expression til assignment. Hermed følger Java syntaksen fra sprog i C familien. Dette er ærgerligt idet '=' anvendes som lighedsoperator i Pascal familien af sprog. (I Java anvendes '==' som lighedsoperator). Det er naturligvis meget vigtigt ikke at forveksle assignment kommandoen med lighedsoperatoren. |
|
|
Den tomme kommando Slide Note Contents Index References Speak | For god ordens skyld bør vi ikke glemme den mest simple kommando, der findes |
På steder, hvor der forventes en kommando, kan vi vælge den tomme kommando. Denne kommando ændrer ikke på programmet's tilstand |
Syntax: Det eneste spor af den tomme kommando er det semikolon, som følger efter det |
|
Blokke Slide Note Contents Index References Speak | Blokke benyttes til at gruppere et antal kommandoer til én kommando. Blokke kan ligeledes bruges til at introducere erklæringer af variable mv. |
The concept blok: En blok er gruppering af kommandoer til én kommando hvori der også kan forekomme variabelerklæringer | En blok er en gruppe af kommandoer som har status af én enkelt kommando. I gruppen af kommandoer kan der forekomme erklæringer af variable. |
Syntax: Bestanddelene i en blok omsluttes af tuborg parenteser, herefter kaldet 'klammer' |
|
I forhold til Pascal svarer en blok til 'Begin ... End'. I Pascal kan vi ikke erklære nye navne i mellem begin og end. Det kan man derimod altid i Java blokke. Vi vil se mange eksempler på brug af blokke i det efterfølgende |
Program: Et Java eksempelprogram med forskellige blokke.
Vi ser her, at kroppen af procedurer blot er blokke. |
|
Program: Samme eksempel som ovenfor med markering af andre blokke.
I main 'hovedprogrammet' ser vi et antal blokke | ![]() |
Kommandoer til udvælgelse i Java (1) Slide Note Contents Index References Speak | Ligesom i Pascal findes der både en 'if' og en 'case'. Syntaksen er dog lidt anderledes end i Pascal. |
Syntax: Den betingede kommando består af et logisk udtryk (boolsk udtryk), som altid skal være i parenteser. Derefter kommer kommandoen. Bemærk, at der ikke er et 'then' nøgleord |
|
Syntax: Den selektive if-else kommando er syntaktisk en betinget kommando med en efterfølgende 'else clause' |
|
Semantisk er der ingen overraskelser i Java's if og if-else kontrolstrukturer. Syntaktisk skal man bemærke, at der altid skal være parenteser om det logiske udtryk, som bruges til at vælge den mellem 'grenene'. Endvidere falder det således ud, at der skal være semikolon før else. Dette er anderledes end i Pascal. Årsagen til denne forskel er Java's regel om at semikolon bruges efter kommandoer, og ikke imellem kommandoer |
Program: En if-then-else kæde i et Java programfragment.
Eksemplet viser hvorledes if-else kommandoer i Java kan indlejres i hinanden for at danne en såkaldt if-then-else kæde.
Eksemplet som så er interessant idet det afspejler den 'officielle' afbildning af procentpoint til karakterer ved
skriftlige eksamener i naturvidenskab og teknik. |
|
Kommandoer til udvælgelse i Java (2) Slide Note Contents Index References Speak |
Syntax: Switch kommandoen er en selektiv kommando, der udvælger en kommando-liste til udførelse baseret på værdien af udtryk . Typen af udtrykket skal være heltallig eller char |
|
Program: Et program der demonstrerer switch i Java.
Programmet udskriver et månedsnavn på basis af en heltals variabel month, som indeholder
nummeret på måneden. Bemærk udførelsen af break i hvert 'case'. Uden disse breaks vil det matchende tilfælde
samt alle de efterfølgende bliver udført! |
|
Program: Switch uden breaks.
Til sammenligning linker vi her til en version af ovenstående program, hvor break kommandoerne er slettet.
Prøvekør dette program, og bliv bekræftet i, hvor vigtig break kommandoerne er for switch | ![]() |
Exercise 3.2. Omformning af if til switch | Se på og prøvekør programmet, som omregner procentpoint til karakterer ved skriftlige opgaver.
Et komplet Java program er til jeres rådighed:
Vær sikker på, at I forstår det i detaljen. Ville programmet virke, hvis vi foretog testene i omvendt rækkefølge? Det er åbentbart umuligt at få 13 igennem dette program; Kan man få 0 ved brug af dette program? Diskuter hvorvidt dette program kan omskrives til brug af Java's switch kontrolstruktur. Begrund jeres svar. Udfør gerne en praktisk øvelse med dette, hvor I afprøver jeres evt. løsning i Java. Dette program kræver adgang til klassen Keyboard eller tilsvarende (SimpletInput, jf. s 111 i Barnes). Hvis ikke din installation giver dig direkte adgang til denne klasse, ligesom det gøres på cs nettet på Aalborg Universitet, kan du blot placere Keyboard klassen i samme katalog som klassen IfDemo1. |
|
Kommandoer til gentagelse i Java (1) Slide Note Contents Index References Speak | Ligesom Pascal har Java tre kontrolstrukturer til gentagelser. Endvidere forholder det sig således, at der er lighedspunkter mellem disse og hhv. while, for og repeat fra Pascal. Dog vil vi se, at der også er forskelle. |
Syntax: Kommandoen gentages nul, en eller flere gange sålænge det logiske udtryk er sand |
|
Denne kontrolstruktur er helt ækvivalent til while i Pascal. Bemærk dog, at det logiske udtryk skal i parentes og at der ikke er noget 'do' nøgleord. |
Program: Et Java program som implementerer Euclids GCD algoritme.
Vi ser et program til beregning af største fælles divisor efter Euclid's metode.
Til sammenligning linker vi nedenfor til et velkendt Pascal program, som løser samme problem |
|
Program: Et sammenligneligt Pascal program.
Programmet beregner ligeledes den største fælles divisor af to tal. | ![]() |
Kommandoer til gentagelse i Java (2) Slide Note Contents Index References Speak | I forlængelse af forrige slide ser vi nu på en anden af Java's gentagelsekommandoer, nemlig do. |
Syntax: Kommandoen gentages en eller flere gange, sålængde det logiske udtryk er sand |
|
Denne løkke ligner Pascal's repeat, dog med den undtagelse at det logiske udtryk i Java's do er en 'løkke fortsættelsesbetingelse', hvorimod betingelsen i Pascal's repeat er en 'løkke hop-ud' betingelse. Hvis der skal gentages mere en kommando i en Java do, skal disse kommandoer puttes i en blok |
Program: Et program som illustrerer Java's do løkke.
Programmet, som bør være velkendt fra basisuddannelsens datalogiundervisning, stiller et spørgsmål indtil
der enten svares ja (en streng der starter med tegnet 'j') eller nej (en streng der starter med tegnet 'n'). |
|
Program: Et sammenligneligt Pascal program.
Også dette program stiller gentagende et spørgsmål indtil der enten svares 'j' eller 'n'. | ![]() |
Kommandoer til gentagelse i Java (3) Slide Note Contents Index References Speak |
Syntax: I denne løkke udføres init kommandoen først. Hvis det logiske udtryk er sand udføres gentagenKommando. Mellem gentagelserne udføres step kommandoen |
|
Java's for løkke bruges i samme situationer, hvor ville bruge Pascal's for løkke. Dette er i situationer,
hvor vi på forhånd ved hvormange gange løkkens krop skal gentages. Java's for løkke er dog
mere generel end for løkken i Pascal, idet
|
|
Kommandoer til gentagelse i Java (4) Slide Note Contents Index References Speak |
|
Program: GCD programmeret med for løkke i Java.
Dette eksempel viser
viser styrken af Java's for til at styre to variable i en løkke, hvor
vi ikke på forhånd ved, hvormange gentagelser der er brug for. Bemærk
iøvrigt, at kroppen af for løkken er tom; vi kan tage vare på alle forhold i løkken
ved blot at have passende init og step kommandoer. |
|
|
Oversigt over Java's hop kommandoer Slide Note Contents Index References Speak |
|
|
Program: Eksempler på brug af continue og break.
Vi ser to løkker inden i hinanden, hvor variablene i og j gennemløber intervallerne hhv. 1..10 og 1..12.
Hvis enten i eller j er lige fortsættes de respektive løkker.
Hvis j er lig med 5, afbrydes den inderste løkke. Bemærk de labels 'loop1' og 'loop2' i programmet |
|
Exercise 3.3. Break og continue | Se på programmet på den tilknyttede slide.Programmet er også her:
Find ud af hvad programmet udskriver (i det mindste de første 6 talpar, eller indtil du finder et 'mønster'). Kør dernæst programmet. Er der overensstemmelse mellem dit resultat af ovenstående og programmets faktiske output? Variér iøvrigt gerne på break og continue kommandoerne på forskellig vis. Vær sikker på, at du kan forklare resultaterne af dine forskellige testkørsler. |
|
Procedurer og parametre i Java |
Oversigt over procedurer og funktioner i Java Slide Note Contents Index References Speak | På denne side vil vi pege på nogle få, overordnede fakta om procedurer og funktioner i Java. |
Java tilbyder ikke lokalt definerede procedurer i procedurer. Men som vi vil se senere i kurset kan man indlejre klasser i klasser på forskellig måde. Og da procedurer (metoder) er den del af en klasse får vi alligevel muligheden for lokal definition af procedurer og funktioner. |
Procedurer og parametermekanismer i Java Slide Note Contents Index References Speak | Alle aspekter af et Java program tilhører en klasse. Der er altså ingen program aspekter uden for klasser i Java. Vi vil her interessere os for de generelle procedure egenskaber ved metoderne i Java. Vi vil først i en senere lektion vende tilbage til disse som metoder i klasserne. Vi vil derfor ikke her omtale egenskaber af metoder, som er knyttet til objekt-orienteret programmering. |
Syntax: En procedure kendes på, at den angives som void. Efter procedure navnet kommer den formelle parameterliste. Selv i tilfælde af, at der ingen parametre er, skal parenteserne være med. Vi har tidligere omtalt blok-begrebet (klammer med erklæringer og kommandoer) |
|
At en procedure angives som værende 'void' skal forstås i den sproglige C tradition, hvor procedure opfattes som funktioner, der ikke returnerer nogen værdi. |
Syntax: En formel parameterliste indeholder en liste af komma-separerede definitioner af formelle parametre. I hver parameter definition kommer typen før navnet på den formelle parameter. |
|
Den formelle parameterliste i et Java program er mere enkelt opbygget end i Pascal, idet vi ikke
kan have grupper af parametre ala integer og real grupper i
|
Dette kaldes for overloadning. En overloadet procedure identificeres ved signaturen, og ikke blot ved procedurens navn. Signaturen af en procedure udgøres af procedurens navn og typerne af alle formelle parametre, herunder deres rækkefølge. Proceduren p, nævnt ovenfor, har Java signaturen p(int,int,int,float,float). Overloadede procedurer er ofte særdeles praktiske. Disse befrier os nemlig for at opfinde nye navne til procedurer, som blot adskiller sig via typerne og rækkefølgen af deres parametre |
Parametermekanismer i Java Slide Note Contents Index References Speak | Parametermekanismer er en helt naturlig fortsættelse af historien om procedurebegrebet i Java |
Java er, overfladisk set, enkel hvad angår parametermekanismer. Alle parametre er værdiparametre. Vi bliver dog nødt til at nuancere synet på dette en smule. Mere konkret bliver vi nødt til at skelne mellem hvad det vil sige at parameteroverføre værdier af primitive typer, og objekter af klasse typer |
The concept værdiparameter: En aktuel værdiparameter kopieres, og kopien bindes til det formelle parameternavn. Den aktuelle parameter kan ikke ændres ved assignment til den formelle parameter | Vi definerer her værdiparameter begrebet. Dette parameteroverførselsbegreb involverer kopieringen samt den deraf følgende beskyttelse af den aktuelle parameter |
|
Dette udsagn er nok mere reelt end det første og øverste udsagn: 'Konsekvent anvendelse af værdiparametre'. Når vi taler om 'reference parametre', 'pass by reference' eller 'call by reference' er det dog vigtigt at understrege, at der ikke er tale om variabelparametre ala Pascal's. Vi hentyder derimod til overførsel af objekternes referencer som værdiparametre, i den forstand vi diskuterede ovenfor. |
Det er ikke muligt at overføre procedurer som parametre i Java. Men da procedurer er en del af et objekter, kan vi let omgå denne tilsyneladende begrænsning. Dette er en lidt mere avanceret observation. Som nogle nok er klar over, kan vi overføre procedurer som parametre i Pascal, og i mange andre sprog. I Java kan vi ikke direkte overføre en procedure P som parametre til procedurer, men vi kan overfører et objekt O, hvori P er en metode. Dette er næsten lige så godt, og i nogle situationer endog bedre, fordi P medbringer 'en kontekst', nemlig objektet og det's tilstand. Notationsmæssigt er det dog tungt og ofte akavet at skulle indlejre en procedure i en klasse, for at kunne overføre den som parameter. |
Udtryk og operatorer i Java |
Udtryk og operatorer i Java Slide Note Contents Index References Speak | Vi går nu nu over til at studere udtryk og operator, som de optræder i Java. Som vi vil se, er der langt flere operatorer i Java end i Pascal. Der er desværre også optræk til en betydelig forvirring, hvor udtryk og kommandoer blandes sammen på en uheldig måde. Vi vil forsøge at bringe orden i denne forvirring inden den får alvorlige konsekvenser for os. |
The concept udtryk: Et udtryk er et program fragment, der alene beregnes med henblik på produktion af en værdi. Beregning af et udtryk kan ikke føre til tilstandsforandringer af variable mv. | Et udtryk kan beregnes, og det returnere altid en værdi. Dette er den rene definition af begrebet. I Java er udtryk dog et mere udflydende begreb. Som vi vil se, er der mange 'udtryk' i Java, som også ændrer tilstanden i programmets lager. |
|
|
|
Operator prioriteter Slide Note Contents Index References Speak | Ligesom i Pascal har operatorer prioriteter i Java. Og principperne bag prioriteringen er nøjagtig den samme. Dog har Java 15 prioriteringsklasser mod Pascal's fire, fem stykker |
En højt prioriteret operator har en lavt prioritetstal i tabellen nedenfor |
Table. Operator prioriteter for operatorerne omtalt ovenfor. De højst prioriterede operatorer står øverst i tabellen. Vi lægger mærke til at de sammenlignende operatorer (< og > eksempelvis) er højere prioriterede end logisk and og or. Det betyder at udtrykket
Bemærk dog, at man i Java gerne må sætte de parenteser man har lyst til for at understrege den syntaktiske sammenhæng i et udtryk. |
|
Increment, decrement og assignment operatorer i Java Slide Note Contents Index References Speak | Java indeholder en række operatorer, samt en række afarter af assignments, som tilhører en af C-kulturens mørke sider. Årsagen er, at begreberne udtryk og kommandoer sammenblandes på en meget uheldig måde. Vi nævner her kort de forskellige muligheder i Java, men vi vil klart anbefale at man ikke gør brug af dem! |
The concept postfix operator: En postfix operator såsom v++ tæller en variabel op efter værdien returneres | Pre- og postfix operatorer er både udtryk og kommandoer. Dvs. at en sådan konstruktion kan forekomme både de steder vi forventer en kommando, og de steder, hvor kun udtryk giver mening. Forvirringen opstår primært når vi anvender pre- og postfix operatorer som udtryk. Her er det nemlig væsentligt, om optællingen sker før eller efter vi returnerer (og anvender) værdien. Når disse konstruktioner anvendes som rene kommandoer, er det ligegyldigt, om vi benytter prefix eller postfix formen. Vær dog så venlig at skrive 'v = v+1' eller 'v = v-1' i stedet for! | |
The concept prefix operator: En prefix operator såsom ++v tæller en variabel op før værdien returneres |
Lad op være en binær operator. En assignment operator udtrykker assignmentet x = x op y som x op= y |
|
Den betingede operator i Java Slide Note Contents Index References Speak | En if-then-else konstruktion (if e then s1 else s2) opfattes som regel som en kommando (og en kontrolstruktur).
I mange programmeringssprog kan man også bruge if-then-else i udtryk.
Vi siger undertiden, at if-then-else anvendt i udtryk er en betinget operator. Eksempelvis er
|
Syntax: Det logiske udtryk beregnes først. Hvis værdien er sand, beregnes og returneres udtryk1, ellers beregnes og returneres udtryk2 |
|
Program: Her ser vi den velkendte fakultetsfunktion, hvor kroppen essentielt er ét udtryk programmeret med den betingede operator |
|
Program: Til sammenligning ser vi en anden version af fakultetsfunktionen, hvor kroppen indeholder en if then else kontrolstruktur |
|
Input output og programstrukturering |
Output i Java Slide Note Contents Index References Speak | For at forstå Java's input/output faciliteter skal man forstå de basale, objekt-orienterede udtryksformer i sproget. Årsagen er, at Java håndterer input og output via operationer på objekter. Vi vil her se på nogle simple, 'idiomatiske' teknikker til besørgelse af input og output. Den fulde forståelse af disse vil først indfinde sig, når vi har studeret objekt-orienteret programmering lidt nærmere i Java. |
Og hvordan skal dette egentlig forstås? Forklaringen er, at at out er en statisk variabel (klasse variabel) i klassen System. Out refererer et objekt af typen PrintStream, som understøtter et helt arsenal af forskellige print og println metoder. Dette er sikkert svært at forstå på nuværende tidspunkt i kurset. Så foreløbigt kan man blot slå sig til tåls med, at man skriver System.out.print(...) når man vil skrive ud på skærmen. |
Program: Eksempler på anvendelse af print og println kommandoer.
+ operationerne sætter strenge samme til en ny streng.
Anvendt på denne måde er der altså ikke tale om aritmetisk addition.
Værdierne af variablene i, d, b og c vil alle blive konverteret til tekststrenge
når de anvendes i en streng sammensætnings sammenhæng. |
|
|
Input i Java Slide Note Contents Index References Speak |
|
|
|
Program: Eksempler på anvendelse af input kommandoer fra klassen Console. |
|
Program: Eksempler på anvendelse af input kommandoer fra klassen Keyboard. |
|
Program: Eksempler på anvendelse af input kommandoer fra klassen SimpleInput. |
|
Exercise 3.4. Indlæsning af heltal | Som det fremgår af lærebogen
er indlæsning af tal et noget mere kompliceret problem
end blot indlæsning af en tekstlinie.
For at indlæse et heltal skal man udtrække cifrene af den indtastede tekststreng (en form for parsning) og beregne tallet.
Hvis man synes, at dette er for omstændeligt, kan
man bruge et alternativt bibliotek, som indholder en mere direkte 'readInt' metode, f.eks.
via klassen Console i kataloget /pack/local-java/lib/corejava/ eller klassen Keyboard fra Lewis og Loftus (2ed). I denne opgave vil vi, for øvelsens skyld, selv programmere en procedure, som indlæser et heltal fra tastaturet. Dette giver en nyttig indsigt i forskellen mellem at læse tekst og tal. Opgaven går altså ud på at indlæse en række tegn, som danner et heltal, og dernæst konvertere de indlæste tegn til et tal af typen int. Man kan sige, at øvelsen går ud på at programmere operationen parseInt - som Java anvender for at løse opgaven. Udfyld derfor detaljerne i følgende programskabelon:
Program skabelonen kan downloades til en fil via følgende link: Skabelon |
|
|
Hvordan struktureres et konventionelt program i Java? Slide Note Contents Index References Speak |
I Java findes der ingen programdele uden for klasserne. Det er altså ikke muligt at skrive en 'programstump' uden om, eller udenfor rammerne af en eller flere klasser i Java. På denne side vil vi se, hvordan man kan benytte klassebegrebet idiomatisk til alligevel at skrive et normalt, Pascal-agtigt program i Java |
|
Program: Et eksempel på et konventionelt program skrevet i Java. |
|
The concept statisk klasse egenskab: En statisk egenskab af en klasse tilhører klassen, og er fælles for alle objekter. Statiske egenskaber kan tilgås uden først at lave instanser af klassen |
Dokumentation af Java |
Dokumentation af Java Slide Note Contents Index References Speak | Vi ser her kort på, hvordan man finder dokumentation af Java |
Man kan håbe, at Java efterhånden er så stabil, at den trykte dokumentation vil kunne leve længere. |
Java API dokumentation følger ikke med når man downloader Java fra Sun's WEB site. Husk derfor at få fat i denne meget vigtige del af Java Systemet, når du hjemtager en ny version af Java Development Kit (JDK). De lokale java klasser er klasser, som vi anvender en del på kurset, herunder Keyboard og Console. Også The Java Tutorial er en separate enhed i forhold the JDK systemet. Denne samling af dokumentation opdateres ganske ofte hos Sun med nye dele. Vær også opmærksom på, at dette kan købes i bogform. Pt. er der tre tykke bøger, som er identiske med online materialet. En Java 1.0 beskrivelse af sproget. Denne meget omfattende sprograpport er desværre ikke opdateret hverken til version 1.1 eller 1.2. Der findes kun et kort appendix, som beskriver sproget's udvikling fra 1.0 til 1.1. En kortere og mere basal tutorial end 'The Java Tutorial'. Samlingen er opdelt i en række korte kapitler |
|
|
Opgaven polygon tegning Slide Note Contents Index References Speak |
Exercise 3.5. Tegning af en regulær polygon | Klassen Crayon er en simpel klasse - set fra et grænseflade synspunkt - som
gør det muligt at lave stregtegninger. Studér først klassens grænseflade, og forstå hvilke
tjenester den tilbyder. Benyt nu klassen Crayon til at skrive et program, som tegner en regulær n-kant (ligesidet trekant hvis n er 3, et kvadrat hvis n er 4, en regulær pentagon hvis n er 5, etc). Indlæs n fra tastaturet, f.eks. via klassen Keyboard. Dit program skal naturligvis have adgang til klassen Crayon. Hvis dit Java system allerede har adgang til klassen, skal du blot importere klassen eller pakken hvori den forekommer. Hvis ikke, kan du placere Crayon klassen i samme katalog som din egen klasse. Det samme gælder for Keyboard. Dette giver umiddelbart adgang til klasserne fra dit eget program. På cs nettet findes Crayon klassen i pakken oopcourse.util. Klassen Keyboard findes i cs1 pakken - ligesom det antages i lærebogen. |
Collected references Contents Index |
|
Chapter 3: De ikke objekt-orienterede dele af Java
Course home Author home About producing this web Previous lecture (top) Next lecture (top) Previous lecture (bund) Next lecture (bund)
Generated: March 31, 2008, 12:08:12