Java Introduktion Historik Java utvecklades ursprungligen av Sun Microsystems för att skriva kompakta program inbäddade i konsumentelektronik, t ex microvågsugnar och tvättmaskiner. Java skapades utifrån C++ syntax och SmallTalks idéer. ( SmallTalk är det första och hittills enda rent objektorienterade programspråket. I SmallTalk betraktas allting som objekt. Om du vill veta mer kan du läsa vidare på http://www.smalltalk.org ) Målet för utvecklingen av Java var att utveckla ett säkert programspråk och man avlägsnade C++-konstruktioner som ansågs vara osäkra eller onödigt komplicerade och svåra att använda. Språket lanserades officiellt i november 1995 och har funnits i flera huvudversioner med en mängd underversioner. Den som används nu är 1.4.2. Beståndsdelar Java är mer än ett språk, det är en hel utvecklingsplattform. Man kan se olika delar i Java: • Språket själv (syntax + semantik) • Java API (Application Programming Interface) – Java API är ett klassbibliotek med färdiga klasser för gränssnittsprogrammering, ADT:er, etc. • Java interpretator (java) – Kör igång en eller flera .class-filer på en virtuell maskin. • virtuell maskin (för plattformsoberoende) (JVM). Mjukvara som emulerar en ”java-dator”, dvs en dator som kan exekvera bytecode i stället för maskinkod. Det finns en JVM för varje operativsystem. • Appletviewer (för testkörning av applets) • ”Dekompilator” för undersökning av .class-filer (javap). Visar viktig information om gränssnittet mot en .class-fil så att man vet vilka egenskaper den har. • Debugger (jdb) – för felsökning. • Dokumentationsgenererare (javadoc) – Läser speciella /** javadoc-kommentarer */ och genererar HTML-kod från dessa. • Garbage Collector (GC) – Ett delprogram som tar hand om minnesdeallokering. Sveper över minnet då och då och ser om det finns områden som ingen använder men som är allokerade. Dessa deallokeras då av GC. Applets och applikationer Man kan i Java skapa två sorters program. • Applets – små program som körs i en browser eller med appletviewer. • Applikationer – Självständiga program som dock kräver en JVM för att kunna köras. Egenskaper Enkelt Java är medvetet designat för att vara så enkelt som möjligt. Det finns t.ex. inga pekare, det har automatisk minneshantering, men trots enkelheten är språket komplett. Likt Språket liknar syntaxmässigt C/C++ mycket. Nästan all syntax och språkliga konstruktioner är identiska. Generellt Objektorienterat som Smalltalk, numeriskt som Fortran, systemspråk som C/C++, distribuerat som inget tidigare språk. Även om de flesta Javaprogram körs som applets i en browser och därmed i ett grafiskt gränssnitt, finns det möjligheter att skriva ”vanliga” traditionella textbaserade applikationer. Objektorienterat Språket är fullt ut objektorienterat då det har stöd för klasser, arv och polymorfism. Plattformsoberoende Eftersom Java körs på en virtuell maskin kan program köras i olika datorer/operativsystem utan omkompilering (förutsatt att det finns en Java Virtual Machine installerad). Java är alltså oberoende av processor, operativsystem och användargränssnitt. Dynamiskt I stället för att länka in alla klasser till en stor exekverbar modul, laddas klasserna in vid behov. Nackdelen med detta är dock att effektiviteten blir lägre. En fördel är att storleken på själva applikationen som laddas ner över nätet kan hållas nere eftersom klasserna som används i den normalt sett finns i Javas lokala bibliotek. Hårt typat Javas filosofi är att det är hårda kontroller vid kompileringen, för att minska risken för fel under exekveringen. Robust Inga pekare, automatisk minneshantering och stöd för undantagshantering gör det lättare att skapa program som inte kraschar. Säkert Java har stöd för att låta okända program exekvera under stark kontroll med begränsade rättigheter. (Det är i alla fall säkrare än andra liknande tekniker). Alla javaprogram körs i ett separat minnesområde och eftersom det inte är möjligt att använda pekare, kan man inte komma åt data utanför detta minnesområde. Dessutom kontrollerar interpretatorn koden innan den tillåts exekvera. Standardiserat Javaspråket, klassbiblioteken (dvs. API:erna) och Java Virtual Machine är specificerade i detalj vilket lämnar minimalt utrymme för tolkning. Javasoft testar applikationer och utvecklingsmiljöer och delar ut märket "100% Pure Java" till godkända produkter. Långsamt Java-språket i sig medför inte att Java-applikationer blir långsamma, utan det är det faktum att programmen körs i en Java Virtual Machine, dvs. ett extra mjukvaruskal, som gör att det kan bli långsammare. Man jobbar med olika trix för att få programmen snabbare: - Just-In-Time kompilatorer som omvandlar bytekod till maskinkod innan den exekveras, - vanlig kompilering till datorspecifik maskinkod utan att gå via bytekod, - adaptiv optimering av "Hot Spots" när program exekveras Klassbibliotek (API:er) Java-standarden omfattar inte bara själva språket utan även ett antal API:er (klassbibliotek) och Java Virtual Machine. Java är därför att betrakta som en hel utvecklingsplattform. Exempel på API:er är: • Filhantering • Användargränssnitt • Nätverkskommunikation De klassbibliotek som vi kommer att använda mest i denna kurs är • .lang • .io • .util Traditionellt Applikation Språk Operativsystem Hårdvara Traditionellt API kontra Java-API Med Java Applikation Java Java Virtual Machine (JVM) Operativsystem Hårdvara Standardiserade filnamn Bytekoden är ett standardiserat kompakt instruktionsformat för en virtuell Javamaskin. Bytekod kan alltså direkt flyttas mellan olika maskiner utan någon omkompilering. <Namn>.java Källkod <Namn>.class Bytekod Java Virtual Machine Källkoden kompileras till bytekod. Bytekoden lagras i en fil med samma filnamn som källkoden men med filändelsen .class och det är denna fil som sedan interpreteras av Java Virtual Machine. Versioner av Java Versionerna av Java styrs av den s.k. Java Development Kit (JDK) som Sun släpper vid varje ny version av Java. I JDK finns en Java Virtual Machine, Java-kompilator och samtliga standardbibliotek för Java. JDK är gratis och kan laddas ner över nätet. Språkändringar (=språktillägg) har varit små mellan olika versioner. Däremot har en hel del utökningar och ändringar skett i klassbiblioteken (även kallade Java API:er eller Javapaket). Det finns vissa språkliga inkompatibiliteter, dvs. ändringar som gör att program skrivna i en tidigare Java-version inte går att köra i en nyare Java-miljö. Dessa språkinkompatibiliteter beror enligt dokumentationen på att man velat täppa till säkerhetsluckor. Att komma igång med Java Källkodsformat Enligt javadefinitionen så ska Unicode användas för Java-källkod, vilket innebär att nationella tecken som å, ä och ö kan användas. Java kontra Javascript JavaScript har inte mycket med språket Java att göra. JavaScript är ett scriptspråk som utvecklats av Netscape för att enkelt kunna lägga in enkla skript direkt i en HTML-sida. Viss syntax från Java har använts i JavaScript. Javafiler Java har en enkel filstruktur. Endast två typer av filer finns: ".java" och ".class". .java En källkodsfil som innehåller en Javaklass måste ha samma namn som klassen följt av suffixet ".java". Normalt innehåller en källkodsfil endast en klass (undantaget är s.k. inre klasser, något vi kommer att komma in på senare). .class När en källkodsfil (”.java”) kompileras skapas en fil innehållande bytekod vilken får samma namn som källkodsfilen, men med suffixet ".class". Länkning Någon länkning sker aldrig i Java varför inga särskilda filer behövs för det. Istället läses klasser in dynamiskt vid exekveringen, och av den anledningen är det viktigt att ".class"filerna har samma namn som klassen de innehåller så att JVM kan hitta klasserna under exekveringen. Olika utvecklingsmiljöer skapar dock andra typer av filer, t.ex. för att hålla reda på olika projekt, debuginformation etc. Om ni går in och tittar närmare i någon av mapparna med BlueJ-projekt som medföljer boken ser ni en rad olika filer. Det finns .java filer och i vissa fall även .class filer (om projektet kompilerats) men även en rad andra filer med andra filändelser. Det är projektfiler, specifika för BlueJ-miljön. Modularisering och katalogstruktur Man har i Java två begrepp när det gäller att gruppera källkod i moduler. Del är det klassbegreppet och dels paketbegreppet. Ett paket grupperar ett antal klasser, och ligger således på en högre nivå än klassen. Klassnamn En javafil döps alltid till samma namn som klassen den innehåller. Om klassen i javafilen heter MinKlass ska filen alltså heta MinKlass.java. En klass med namnet MinKlass.java kompileras alltid till en fil med namnet MinKlass.class. Paketnamn På motsvarande sätt används paketnamnet för att namnge filkatalogen som innehåller filerna i paketet ifråga. Dvs. paketmekanismen styr hur koden lagras i olika kataloger i filsystemet. Paketnamnet kan bestå av flera delar åtskilda av punkt. Man kan på det sättet skapa en hierarki av paket vilken i filsystemet motsvaras av en hierarki av kataloger. På detta sätt får man möjlighet att dela upp en applikation i delsystem. Filer kan ligga på vilken nivå som helst i hierarkin. Exempel: Klassen java.awt.Button ligger i katalogen <java-directory>/java/awt/ i en fil med namnet Button.class. Ett paket definierar en egen namnrymd. Dvs. samma namn på klasser, metoder och fält kan återanvändas i olika paket utan att konflikt uppstår. Källkodsfiler ".java" och bytekodsfiler ".class" lagras normalt i samma katalog. Miljövariabeln CLASSPATH används för att tala om för Java Virtual Machine var ens egna ".class"-filer ligger. Om ingen paket-deklaration görs så kommer klassen i filen att hamna i ett paket utan namn. En sådan klass är typiskt en klass som är helt applikationsspecifik och endast ingår i den applikation där den är definierad. I övningarna och laborationerna i denna kurs kommer vi inte att skapa egna paket, utan klasserna ni skapar kommer att tillhöra sådana namnlösa paket. Kodningskonventioner Vi kommer att tillämpa de kodkonventioner, Code Conventions for the JavaTM Programming Language, som finns på Suns hemsida: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html • • • • • • Klassnamn och interface ska alltid inledas med versal. Exempel: MinKlassSak Metoder ska vara verb med gemen första bokstav. Inom namn används versal för att skilja på ord. Exempel: doSomethingWithThisThing Konstanter ska vara enbart versaler. Exempel: SIZE, NUMBEROFTHINGS Variabler har gemen första bokstav. Variabler bestående av flera ord kapitaliserar första bokstaven i varje ord precis som för metoder. Exempel: MinKlassSak mittLillaObjekt Använd alltid {} där sammansatta satser kan skrivas. (För alla C++ programmerare är detta knappast nödvändigt, men Javas konvention är sådan.) Exempel: if ( a.test( ) ) { a.miffo( ); } Bara en javasats per källkodsrad. Applikationer och applets I Java kan man skriva program av två olika typer, dels Java-applikationer och dels Javaapplets. Java-applikationer exekverar som fristående program, medan Java-applets exekveras från ett annat program (normalt en webbläsare). Vi kommer att börja med att skriva applikationer. Applets kommer att introduceras i senare moduler. Java-applikationer och main-metoden Det som särskiljer en Java-applikation ifrån en Java-applet är att Java-applikationen alltid innehåller en main-metod i den "huvudklass" som man startar applikationen med. Programexemplen nedan visar en jämförelse mellan C++ och en Java-applikation och innehåller definitionen av main metoderna. Hur en Java-applikation kompileras och körs går vi igenom i kompendiet ”Att kompilera Javafiler”. //Hello World skriven i C++ #include <iostream.h> void main(void) { cout << ”Hello, World” << endl; } //Hello World skriven i Java import java.io.*; class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); //Display the string. } } Signaturen för main-metoden innehåller tre modifierare: public indikerar att metoden kan anropas från vilket objekt som helst static indikerar att metoden är en s.k. klass-metod void indikerar att metoden inte returnerar något värde Main-metoden accepterar ett argument vilket är en array med element av typen String. Om man vid start av programmet skriver in några argument efter klass-namnet så läggs varje sådant argument in i ett element i arrayen args. Utvecklingsmiljöer för Java Den grundläggande utvecklingsmiljön för Java är Java Development Kit (SDK) från JavaSoft. SDK utgör en referens för Java, dvs. SDK bestämmer vad som är "standard Java". SDK är en kommandoradsbaserad miljö. SDK kan laddas ner gratis från java.sun.com och innehåller: Java kompilator Java Virtual Machine (JVM) Java klassbibliotek Java AppletViewer Java Debugger och andra verktyg Dokumentation (laddas separat) Java SDK finns också på CDn som medföljer kursboken. Kommandot för att kompilera fil innehållande en klass: >javac <filnamn>.java (filnamn = namnet för klassen som filen innehåller) Kommandot för att starta JVM och exekvera ett program: >java <klassnamn> (klassnamn för klassen med main-metoden; inget suffix)