JAVA CHRISTOFFER MARTINSEN 1
2 CHRISTOFFER MARTINSEN Contents 1. Introduksjon 3 1.1. Innledning 3 1.2. Buzzwords 3 1.2.1. Simple 3 1.2.2. Object Oriented 3 1.2.3. Distributed 3 1.2.4. Robust 3 1.2.5. Secure 3 1.2.6. Architecture Neutral 3 1.2.7. Portable 4 1.2.8. Interpreted 4 1.2.9. Hight Performance 4 1.2.10. Multithreaded 4 1.2.11. Dynamic 4 2. Syntax 4 2.1. Leksikalske Struktur 5 2.2. Operatører 6 2.2.1. Aritmetiske operatører 6 2.2.2. Streng sammensettende operatører 6 2.2.3. Økende og minskende operatører 6 2.2.4. Likhetsoperatører 6 2.2.5. Boolean operatører 7 2.2.6. Uttalelser 7 2.2.7. Uttrykkende uttalelser 7 2.2.8. Sammensatte uttalelser 7 2.2.9. Merket uttalelse 7 2.2.10. Lokal variabel erklæring uttalelse 7 2.2.11. Hvis/ellers uttalelse 8 2.2.12. Skift uttalelsen 8 2.2.13. Mens uttalelsen 8
JAVA 3 1. Introduksjon 1.1. Innledning. Javaspråket er et top moderen, objekt-orientert språk som har en syntaks som ligner på C. Språket er laget med hensikt å være kraftig, men allikevel ikke overkomplekst som andre språk, for eksempel C++. Dette bidrar også til å gjøre det lett å programmere feil fri kode. Java ble utgitt i 1996, det fikk utrolig mye popularitet i medier, som The Washington Post og The New York Times, det er også det eneste programmeringsspråket som har fått en 10 minutters story på National Public Radio. Java er ikke bare et programmerinsspråket, det en hel platform. 1.2. Buzzwords. 1.2.1. Simple. 1. Simple Java syntaksen er en renskrevet versjon av C++ syntaksen, men designerene prøvde ikke å fikse alle de klumsete kjennetegnene i språket. Java er også lite og lett, en av målene var at Java skulle kunne kjøres stand-alone på små maskiner. Størrelsen på tolkeren og klasse støtten er på bare 40K bytes. Det skal sies at graphical user interface (GUI) filene er mye større. 1.2.2. Object Oriented. 2. Object Oriented Enkelt sagt så er objekt orientert design en programmeringsteknikk som har fokus på dataen (=objektet) og grensesnittet til det objektet. Objekt orientering har vist sin verdig de siste 30 årene, og det er utenkelig at et moderne programmeringsspråk ikke bruker det. Den største forskjellen mellom Java og C++, ligger i den mangfoldige arven, som Java har byttet ut med et simplere grensesnitt konsept, og i Java metaklasse modellen. 1.2.3. Distributed. 3. Distributed Java har et omfattende bibliotek for kopieringsrutiner med TCP/IP protokoller som http og FTP. Java applikasjoner kan opne og hente objekter over internett via URLer, med samme enkelhet som et lokalt fil system. Java sin nettverksevne er både sterk og enkel å bruke. 1.2.4. Robust. 4. Robust Java er beregnet for å skrive programme som man kan stole på. Jave fokuserer mye på å finne og fikse problemer tidlig. Også å fjerne situasjoner som fort blir utsatt for error og feil. Den største forskjellen mellom Java og C/C++ er at Java har en pointer modell som eliminerer muligheter for å skrive over minne og å korruptere data. Java kompilereren finner mange problemer før programmet i det heletatt blir kjørt på maskinen. 1.2.5. Secure. 5. Secure Java er sikker og har høy fokus på sikkerhet. De bugs og svakheter som har blitt oppdaget, har raskt blitt fikset, alle filene for sikkerthet, spesifikasjoner osv har blitt publisert slik at brukere lett kan finne og si ifra om dette. 1.2.6. Architecture Neutral. 6. Architecture Neutral Kompilerer genererer en arkitektur vennlig objekt fil format, kompilerer koden er kjørbar på mange prossessorer, gitt at den har et Java runtime system. Java kompilereren gjør dette ved å generere bytekode instrukser som ikke har noe med data arkitekturen å gjøre. Det har blitt designet for å være både enkelt å tolke på alle maskiner og lett å oversette til innebygf maskin kode.
4 CHRISTOFFER MARTINSEN 1.2.7. Portable. 7. Portable I motsettning til C og C++ er det ikke noe implementerings nødvendighet aspekt. Størrelsen av den primitive data typen er spesefik, det er også oppførselen til regningen av dem. Et eksempel på dette er en int i Java er alltid 32-bit heltall, i C/C++, kan int bety 16-bit heltall eller 32-bit heltall. Og ha en fast størrelse på nummer størrelsen sparer mye porteringstrøbbel som kan kommer senere. 1.2.8. Interpreted. 8. Interpreted Java tolkeren kan kjøre Java bytekode direkte på alle maskiner som oversetteren har blitt portet til. Siden linking er en lettvekt prosses, kan utviklingen skje mye raskere. 1.2.9. Hight Performance. 9. High Performance På det fleste platformer så brukes det en just-in-time (JIT) kompilerer. Disse fungerer ved å kompilere bytekoden om til lokal kode én gang for så og kalle på den hvis det er nødvendig. Dette setter opp tiden betraktelig. 1.2.10. Multithreaded. 10. Multithreaded Gevinstene med multithreading er bedre interaktiv respons og real.time oppførsel. I forhold til andre språk er det lett å jobbe med i Java. Threads i Java kan også ta i bruk multikjerne prossesorer. 1.2.11. Dynamic. 11. Dynamic På flere måtes er Java et mer dynamisk språk enn C og C++. Det ble designet for å kunne tilpasse seg et utviklende miljø. Biblioteker kan fritt legge til nye metoder og variables uten noen effekt på klient deres. 2. Syntax Syntax Java programmer skiller mellom store og små bokstaver, hvis man gjør dette feil så vil ikke programmet kjøre. Det fleste koder og variabler slutter med semikolon (;), det er en vanlig feil og glemme dette, dette vil også føre til at programmet ikke blir kjørt. Selve programmet kan skrives i en hvilken som helst tekst editor som har muligheten til å lagre filer i et rent tekst format, som for eksempel Smultron, EMACS, eller notepad. Filer lagres så med filnavn.java, dette er viktig for å kunne kompilere tekst filen til et ferdig program. Når filnavn.java blir kompilert, lager dette en ny fil som heter filnavn.class, dette er en ferdig kompilert versjon av programmet, men den er fortsatt ikke blitt kompilert til lokal maskin kode, for det så må den igjennom et nytt program, nemlig Java tolkeren (interpreter). Alle Java programmet består av klasser, alt som skal skje i et Java program må skje inne i en klasse for å kunne fungere, det eneste som ikke følger denne regelen er kommentarer, da disse blir ignorert av Java. Klasser er en fundamental del av objekt orientert programmering. Det som definerer starten og slutten av en klasse er og, det mulig å ha flere klasser inne i en klasse. En klasse definerer et sett med samhandlende medlemmer (members). Disse medlemmene kan være felt, metoder, eller andre klasser. En metode er en navngitt bit med Java kode, som kan bli kjørt eller kalt av Java programmet, til å kjøre koden den inneholder. I andre programmeringsspråk kalles dette ofte for funksjoner (function). Metoder har parametere og returnerer verdier. Når en metode blir kalt på så gir du den data som du vil at den skal jobbe med, også gir den deg et svar tilbake. En metode er som en algebra funksjon: y = f(x). I det stykker så er f det du vil at skal skje med x som er verdien du sender til programmet, også får du svaret y tilbake. Metoder er komponert av en eller flere uttalelse (statements),
JAVA 5 som Java tolkeren utfører i den rekkefølgen de er skrevet opp i, altså uttalelsen i linje 4, blir kjørt før uttalselsen i linje 5. 2.1. Leksikalske Struktur. Leksikalske Struktur Java programmer skrives i Unicode, altså så kan Unicode tegn bli brukt hvor som helst i et Javaprogram, dette inkluderer også variabler og identifikatorer. Med Unicode tegnsettet så kan nesten alle skrevne språk representeres. Som sagt så skiller Java mellom store og små bokstaver, de vil si at en variabel som heter i, ikke kan kalles ved å skrive I, eller at WHILE, While og while ikke er det samme nøkkelordet. Mellomrom, ny linje og lignende blir ignorert av Java, og blir brukt for å gjøre koden mer leselig for programmere. Man kan sette inn kommentarer i kode ved hjelp av //, Java tolker dette slik at alt etter // blir ignorert til slutten av linjen, dette er et hjelpeverktøy som er nyttig for å opplyse andre programmere om hvordan programmet fungerer, eller som hjelp til å huske hva koden gjør. Koden /* starter en kommentar som går over flere linjer og denne slutter ikke før */ blir skrevet, alt i mellom dette regnes som en kommentar. Denne typen kommentar kan ikke bli nestet sammen, man kan ikke bruke /* og */ inne i en annen. Den siste kommentar koden er /** og er en dokument kommentar (doc comment), hvis du skriver en klasse du forventer at andre programmere skal bruke, så brukes denne koden for og dokumentere hvordan klassen oppfører seg. Den avsluttes med vanlig */. Et program som heter javadoc tar ut disse kodene og lager en online dokumentasjon for den klassen. En dokument kommentar kan inneholde html linker og kan brukes syntaks som javadoc forstår. I Java finnes det en del ord som er reservert, og disse kan ikke brukes til å navngi variabler, klasser etc. Disse er en del av Java syntaksen. Noen av disse brukes til Java uttalelse og primitive typer. En identifikator er et navn som blir gitt til en del av Java programmet, det kan være en klasse, eller metode og så videre, disse kan være hvilken som helst lengde og kan brukes både tall og bokstaver fra Unicode tegnsettet. Men det kan ikke startet med et tall, da vil kompilatoren tro at dette er en verdi istedenfor en identifikator. Generelt sett så kan ikke navnet inneholde tegnsetting, selv om det finnes noen untak, som for eksempel ASCII understrek ( ). Man kan da bruke detteerentest, og dette er en test. Literals (ord, bokstaver, nummre eller tegn som har en verdi) er verdier som finnes i Java sin kjernekode (source code). Dette inkluderer heltall, flyttall og karakter strenger, og reserverte ord som true, false og null. I Java brukes tegnsetting som elementer, for eksempel for å starte eller avslutte en klasse, eller for å vise når en variabel slutter. Tegnsettingen deles inn i delere (seperators) og operatører (operators). Åtte grunnleggende datatyper støttes av Java, disser er kjent som primitive typer. Disse datatypene inkluderer boolean, karakter, fire heltall typer og to flyttall typer. De fire heltall typene og de to flyttall typene er forskjellige i antall bits som representere dem og antall numre de kan representere. Boolean er en sannhetsverdig og har bare to mulige utfall, altså true/false, on/off eller yes/no. Java har som sagt reservert ordene true og false for å bli brukt som en boolean verdig. Karakter typen er verdig som inneholder et eller flere tegn fra Unicode, koden for å bruke denne er char og den er 16-bits lang. De fire heltall typene er byte, short, int og long, disse variere i hvor mange
6 CHRISTOFFER MARTINSEN bits de kan ha som verdi. For eksempel byte som er 8-bits går fra -128 til 127, merk at 128 ikke er det siste tallet, dette er fordi 0 regnes som en egen verdi, på den positive siden. Så hvis man hadde teller med 0 så blir det total 128 tegn på den positive siden. Dette gjelder for alle heltall typene. Flyttall i Java er ekte numre som er representert av float og double, float er 32-bits og double er 64-bits. Begge disse overholder seg til IEEE 754-1985 standarden, som sier hvordan formatet på nummeret skal være, og hvordan det aritmetiske skal oppføre seg. Dette kan vises som et nummer etterfulgt av e eller E, eksponent, også et annet nummer. Det siste numre er hva det skal opphøyes i. For eksempel 1.2345E02 er 1.2345 x 102 eller 123.45. Uttrykk (Expressions) blir evaluert av Java tolkeren for å beregne verdien av uttrykket. De enkleste uttrykkene kalles for primære uttrykk og består av literals og variabler. Når Java tolkeren evaluerer et literal uttrykk så blir verdien den samme som literal. Men med en variabel så blir verdien den verdien som variabelen holder på. Mer komplekse uttrykk lager man ved å bruke operatører til å slå sammen flere primære uttrykk. 2.2. Operatører. Operatører 2.2.1. Aritmetiske operatører. Aritmetiske operatører Dette er operatører som behandler numre, disse kan bli brukt med heltall og flyttall og også tegn, men ikke boolean verdier. Den første av de aritmetiske operatørene er addisjon (+), + operatøren legger sammen to numre, men den kan også brukes til å legge sammen strenger. Den neste er subtraksjon (-), - operatøren bruker en binær operatør som trekker det andre tallet ifra det første. - operatøren kan også brukes som til å gi et nummer en negativ verdi. Multiplikasjon (*) brukes for å gange to verdier sammen. Divisjon (/) brukes for å dele den første verdien på den andre. Modulo (%) fungerer ved å ta resterende verdi når den første verdien blir delt på den andre verdien. Altså 7%3 blir 1. 2.2.2. Streng sammensettende operatører. Streng sammensettende operatører + operatøren kan brukes til å slå sammen strenger. Et objekt blir konvertert til en streng ved å kalle på tostring() metoden. 2.2.3. Økende og minskende operatører. Økende (increment) og minskende (decrement) operatører Operatøren ++ øker verdien til enheten, som må være en variabel, et element av en array, eller et felt av et objekt, med en. Når operatøren blir brukt før en enhet så blir verdien av enheten økt også blir den evaluert. Hvis operatøren blir brukt etter så økes verdien, men enheten blir evaluert før den blir økt. Sånn som ++, så fungerer likt, utenom at denne trekker 1 ifra enheten. 2.2.4. Likhetsoperatører. Likhetsoperatører Disse brukes for å se om flere elementer har samme eller ulike verdier, eller for å kjøre teste om hvilken verdi som er størst, forholdsoperatører. Likhetsoperatører gir boolean svar, altså true/false, og brukes som oftets i if, while eller løkker. Er like (==) brukes for å se om enheter har samme verdi, altså om verdien er true. Ikke lik (!=) fungerer som ==, men motsatt. Hvis!= blir true så er ikke svarene like. Forholdsoperatørene brukes på numre og tegn, men kan ikke brukes på boolean verdier, objekter eller arrayer. Mindre enn ( ), blir true hvis det andre elementet er større enn det første. Mindre eller lik ( =), blir true hvis det
JAVA 7 andre elementet er større eller lik det første. Større enn ( ) og større eller lik ( =) fungerer akkurat som de forrige, bare motsatt. 2.2.5. Boolean operatører. Boolean operatører Hvis vi ser på likhets- og forholdsoperatørene, så gir disse et boolean svar, noe som ofte blir brukt i løkker. Istede for å bare se på forholdet mellom to elementer kan vi bruke boolean (eller logiske) operatører. Boolean operatører er avhengig av at verdiene den skal jobbe med er et boolean svar. Betinget OG (conditional AND) && sjekker om sjekker om begge elementene er like, om begge er true, hvis en eller begge elementene er false så blir svaret false. Den blir kalt betinget, fordi det ikke er sikkert at det andre elementet blir sjekket, hvis det første elementet er false, så stopper den opp og gir verdien false. Betinget ELLER (conditional OR), denne sjekker om en av elementene er true, samme som med betinget OG, så er det ikke garantert at den sjekker det andre elementet. Hvis en av elementene er true så blir verdien true, hvis begge er false så blir verdien false. Boolean IKKE (NOT)! forandrer true til false og motsatt. 2.2.6. Uttalelser. Uttalelser (Statements) En uttalelse er en enkel kode som blir utført av Java tolkeren, disse blir utført etter hverandre, i den rekkefølgen de ble skrevet i. Unntak finnes, hvis man bruker løkker (loops) så kan man overskrive rekkefølgen. 2.2.7. Uttrykkende uttalelser. Uttrykkende uttalelser (Expression Statements) Noen typer uttrykk har side effekter, de gir ikke bare ifra seg en verdi, men de forandrer også programmet. Alle uttrykk med side effekter kan brukes som en uttalelse, ved å legge til et semikolon (;) etter uttalelsen. 2.2.8. Sammensatte uttalelser. Sammensatte uttalelser (compound statements) En sammensatt uttalelse er når noe blir gruppert inn i klammeparenteser. Antall elementer har ingen betydning. 2.2.9. Merket uttalelse. Merket uttalelse (Labeled Statements) Dette er en uttalelse som har fått et navn, dette gjøre ved å starte en løkke med loopnavn: etterfulgt av koden. Dette brukes slik at man kan bruke break og continue som stopper eller fortsetter løkken. For eksempel break loopnavn;. 2.2.10. Lokal variabel erklæring uttalelse. Lokal variabel erklæring uttalelse (Local Variable Declaration Statements) En lokal variabel, ofte bare kalt variabel, er et symbolsk navn for et sted å lagre en verdig som er definert i en metode eller en sammensatt uttalelse. Alle variabler må bli erklært før de kan brukes, altså lages, og siden Java er et strengt språk så må variabelen defineres til riktig datatype, og når den har blitt definert til en datatype så må den holde seg til det. String S; lager en variabel S av typen String. Det også mulig å gi variabelen en verdi når den blir laget, dette gjøre ved inkludere en et uttrykk som spesifiserer verdien, for eksempel int tall = 1;, dette lager variabelen tall, av typen int (heltall) som har verdien 1. Lokale variabler kan kun brukes inne i den metoden eller kodeblokken den er definert i.
8 CHRISTOFFER MARTINSEN 2.2.11. Hvis/ellers uttalelse. hvis/ellers uttalelse (if/else statement) hvis uttalelsen er en stor del av Java, og andre programmeringsspråk, denne koden lar Java ta valg, eller å kjøre uttalelser betinget. hvis sjekker om uttrykket er true, hvis det er det så vil den kjøre koden som den inneholder. Det er også mulig å nestet flere hvis setninger sammen. Hvis uttrykket blir false så vil den hoppe over koden. Etter hvis uttalelsen er det mulig å legge til en ellers uttalelse, det vil si at hvis den første uttalelsen, hvis, blir false så vil den kjøre koden i ellers uttalelsen. En ellers setning vil alltid følge den forrige hvis setningen. Derfor lønner det seg og nøste sammen hvis setningen med og, slik at man får sammensatte uttalelser. Det finnes også en tredje uttalelse som gjør at man kan velge mellom flere enn to muligheter, og det er ellers hvis (else if). Dette er en sammensetting av ellers og hvis. I forhold til ellers så trenger denne en uttalelse, sånn som hvis. 2.2.12. Skift uttalelsen. Skift uttalelsen (Switch statement) En hvis uttalelse lager en gren i flyten av programmets utførelse, det er mulig å bruke mange hvis uttalelser, men dette er ikke noe som alltid er ønskelig. I hvert fall ikke hvis det en hvis uttalelse blir brukt for å teste samme variabel flere ganger, da bruker man heller en skift uttalelse. Det starter med switch(n) hvor n er variabelen som skal sjekkes, også inne i den nestete skift uttalelsen brukes for eksempel case 1 for å sjekke om n = 1. Også utføres koden som er inne i case 1, hvis ikke så går den videre til neste case. Når den har utført uttrykket i riktig case så avslutter man ved å skrive break; på slutten av hvert case. Hvis den ikke finner en case som passer, så kjører den en default:, denne fungerer akkurat som ellers, og er på mange måter en siste utvei ut ifra løkken. 2.2.13. Mens uttalelsen. Mens uttalelsen (while statement) Det er også en av de grunnleggende kontroll uttalelsene som gjør at Java kan ta valg, og akkurat mens uttalelsen gjør at Java kan utføre repeterende valg. Hvis uttrykket blir false så hopper Java over mens løkken, men hvis det blir true så blir koden i mens løkken uteført, så blir uttrykket sjekket på nytt også fortsetter den igjen. Dette vil fortsette helt til uttrykket blir false.