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)