Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Lektion Java Grunder
Javas historia
Ursprungligen utvecklades Java (1991) för att användas i olika typer av konsumentelektronik (mikrovågsugnar,
videoapparater) av programmerare på Sun. Språket kallades i början Oak men döptes senare om till Java
eftersom det redan fanns ett språk som hette Oak. Det blev inget lyckat projekt och det hände inget mer. Men när
Internet och www-utvecklingen på allvar tog fart 1995, så insåg man att Java var som klippt och skuren för
Internet och så dammade man av och fräschade upp Java igen. Java började användas på webben 1996 då
Netscape gav möjlighet att använda det i sin browser.
Programmeringsspråket Java
Java används dels för att skapa applikationer (vanliga program) som startas och körs lokalt på en dator, dels för
att skapa applets (små program) som distribueras över Internet och körs lokalt (på hårddisken) hos besökaren.
Applets gör att din hemsida blir mer interaktiv.
Några av Javas karaktärsegenskaper är:
Objektorienterat
Ett av de dominerande tillvägagångssätten vid modern programmering är objektorientering. Mycket kortfattat
går det ut på att programmen delas upp på mindre delar - objekt - som vart och ett har en uppsättning data, och
metoder för att utföra vissa uppgifter.
Portabelt
Synonymt med plattformsoberoende, dvs kan köras på många olika datortyper (såväl en Unix arbetsstation som
på en PC) utan att behöva anpassas först. Det enda kravet för att de ska kunna köras är att användaren har en
web-läsare som kan hantera Java-kod (att den har en javatolk).
Dynamiskt
Bara de objekt som behövs för en given uppgift kommer att laddas.
Enkelt och robust
-Automatisk minneshantering
-Inga pekare (vanligaste orsaken till fel i program)
-Noggrann säkerhetskontroll både vid kompilering och när programmet skall köras
Flertrådat
Flertrådskörning (multithreading) är en modern teknik som medger en snabbare och effektivare körning av
krävande program.
Utökat med ett rikt förråd av färdiga paket
T.ex. klasser som hanterar grafiska gränssnitt på ett enhetligt sätt (java.AWT) och klasser för kommunikation
över TCP/IP-nät (java.net).
Skillnaderna mellan Java och C++
Man kan säga att Java är efterföljaren till C++. Programmerarna som konstruerade Java sneglade en hel del på
C++ och såg till att anamma de bra bitarna. Eftersom Java konstruerades med Internet som användningsområde
anpassade man det dessutom speciellt för nätverk. Men den absolut viktigaste skillnaden är graden av
objektorientering. C++ uppmuntrar bara programmeraren att använda objektorientering medan Java tvingar
programmeraren att använda det. Detta beror på att C++ konstruerades för att vara bakåtkompatibelt med C.
JVM (Javas Virtuella Maskin)
För att förstå tekniken bakom Javas Virtuella Maskin måste vi först ha lite allmän kunskap om de olika sätt
datorprogram kan "skapas". Eftersom vi människor inte har direkt lätt för att förstå innebörden av ändlösa
strängar av maskinkod skapade man redan i tidernas begynnelse olika "språk" som människor relativt enkelt
kunde förstå och som dessutom kunde översättas till maskinkod vilka i sin tur datorerna förstår. Ganska snart
bildades en uppsjö av olika språk och själva översättningstekniken kom att utvecklas åt två skilda grenar.
Kompilerande språk och Interpreterande språk.
/PB
Sida 1
Programmering B
JAVA Grunder
Värmdö Gymnasium
Datainstitutionen
110118
Kompilerande språk
I kompilerande språk översätts språkets instruktioner (koden) till maskinkod av en kompilator som körs vid
skapandet av programmet. Vid kompileringen är det också brukligt att kompilatorn analyserar koden och gör den
snabbare och mer effektiv (optimering). Detta är en ganska tidsödande process, speciellt om man p.g.a. diverse
fel tvingas kompilera om koden många gånger. Men i gengäld så får man en mycket effektiv och snabb kod när
den väl är översatt (kompilerad). Exempel på kompilerande språk är: Assembler, C och Pascal.
En kompilator översätter hela koden på en gång.
Interpreterande språk
Genom att helt enkelt låta bli att översätta koden till ettor och nollor förrän den berörda instruktionen i
programmet exekveras så slipper man de irriterande väntetiderna som uppstår vid kompilering. De största
nackdelarna med interpreterande språk är att de måste översättas varje gång man kör dem och att de inte kan
optimeras på samma sätt som kompilerade program. Detta gör dem i regel ganska långsamma. En annan nackdel
är att man måste skicka med själva Interpreten med programmet. Ett exempel på ett Interpreterande språk är
Basic.
En Interpreterare översätter koden allt eftersom den exekveras.
Java, en kompromiss
Java kan sägas vara en blandning mellan ett kompilerande språk och ett interpreterande språk. Det som händer är
att källkoden(en fil med filändelsen .java) kompileras (översätts) till *bytekod* som lagras i en ny fil (med
filändelsen .class). Denna procedur behöver bara utföras EN gång. Denna bytekod är plattformsoberoende och
kan förstås av JVM (Javas Virtuella Maskin). När man skriver java Hej eller öppnar en applet i webbläsaren
läses instruktionerna in och översätts till plattformsspecifik kod av JVM. Denna procedur måste upprepas
VARJE gång programmet ska köras. JVM är egentligen inget annat än en vanlig interpreterarare.
JVM är hemligheten bakom Javas plattformsoberoende.
Fördelen med detta system är att koden blir plattformsoberoende. Nackdelarna är att koden inte kan optimeras
fullt ut och att JVM måste vara närvarande för att programmen ska kunna exekveras. På detta vis har Java fått
ryktet om sig att vara långsamt.
JIT kompilatorer
För att råda bot på hastighets problemen har en ny sorts Javakompilatorer utvecklats s.k. JIT (Just In Time)
kompilatorer. De ersätter den gamla VM (Virtuella Maskinen) genom att istället för att som förut interpretera
bytekoden, kompilera den direkt till maskinkod. Detta möjliggör att viss optimering kan utföras, eftersom denna
kompilering och optimering sker varje gång applikationen eller appleten exekveras kan optimeringen inte vara
för avancerad och tidsödande. Dessa JIT kompilatorer måste precis som JVM finnas närvarande för att
programmen ska kunna köras. Det håller hela tiden på att utvecklas nya intelligentare versioner av dessa JIT
kompilatorer som bara kompilerar och optimerar de delar av programmen där det verkligen behövs. Faktum är
att Javas hastighet nu börjar kunna mäta sig med C++ i vissa avseenden.
En JIT kompilator kompilerar bytekoden istället för att interpretera den.
En programmerare skriver sin kod (kallas för källkod) och sparar den som en .java fil (textfil). Den kompileras
sedan i en kompilator (ex. JDK) och sparas som en .class fil (bytekod). Detta innebär att du som
användare/hemsidessnickrare inte kan gå in i en .class fil och ändra på något. Man kan nästan säga att en
bytekodsfil är ett program och en .exe fil går man inte in och ändrar i.
/PB
Sida 2
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Första programmet
Skriv in följande kod.och spara filen som FirstProgram.java .
public class FirstProgram
//Skapar en klass vid namn FirstProgram
{
public static void main(String args[])
{
System.out.println("Hejhopp, min första Java-applikation!");
}
}
Kompilera nu källkoden.
Nu skapas en fil vid namn FirstProgram.class. Eventuellt kommer det nu ett eller flera felmeddelanden som
behöver åtgärdas.
Kör nu programmet.
Om allt har fungerat som det var tänkt kommer du att se meddelandet Hejhopp, min första Javaapplikation! på skärmen.
Rad1: class Hejhopp { //Skapar en klass vid namn Hejhopp
Med "class Hejhopp" skapar vi en klass och döper den till FirstProgram och eftersom denna klassen innehåller
programmets "main" metod måste även själva källkodsfilen döpas till FirstProgram.java.
Rad2: public static void main(String args[]){
Detta är syntaxen för den huvudmetod (main) som måste finnas i alla Javaprogram jfr med C++ main.
Nyckelordet "public" betyder att metoden är synlig och anropningsbar av andra klasser vilket är ett krav för
mainmetoden. "static" betyder i det här fallet att man inte behöver tillverka ett objekt av klassen Hejhopp för att
kunna anropa metoden main. "void" är ett bekant begrepp för er C++ programmerare. Returntypen void används
när man vill tala om att man inte vill att metoden ska returnera något värde. Om du velat att metoden skulle
returnera ett heltalsvärde skulle du skrivit int istället för void. "main" är namnet på metoden. "(String args[ ])"
betyder att metoden main tar emot meddelanden (argument) av typen sträng vektorer.
Datatyper
Namn
Minnesutrymme
Typ
Övrigt
int
short
long
float
double
char
4
2
8
4
8
2
heltal
heltal
heltal
decimaltal
decimaltal
tecken
-2147483648 till 2147483647
-32768 till 32767
 9miljadersmiljarder
 3.4*1038
 1.8*10308
UNICODEstandard (ASCII är en
delmängd), t ex char
yesChar=’y’;
Sant resp Falskt
boolean
String
int[]
/PB
boolskt värde,
true eller false
strängar av
tecken
heltalsarray
Sida 3
T ex string str=”HEJ”;
T ex int[] talLista={1,2,3};
eller t ex int talLista[3];
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Variabelnamn
Variabelnamn i Java måste börja med en bokstav, sen kan namnet bestå av vilka tecken som helst, dock inte
mellanslag. Det underlättar betydligt om man håller sig till ett system när man namnger sina variabler. ”Ungersk
notation” är ett av de mest använda. Då börjar alla variabelnamn med liten bokstav och har stora bokstäver för
första bokstaven i alla efterföljande ord.
T ex : int antalEleverSomTyckerJavaÄrRoligt
(var noga med stora/små bokstäver eftersom Java gör skillnad på dem)
char
Datatypen char fungerar lite annorlunda, den kan som vi redan sagt lagra tecken. Egentligen lagras aldrig några
tecken i variabler av typen char, det som lagras är ett tal som i sin tur representerar ett tecken. Det finns en tabell
som översätter tecknen till tal och tvärt om. Den tabell som Java använder kallas Unicode och kan hantera 34168
olika tecken. Som tur är sköter Java denna "översättning" helt automatiskt, bara vi inte glömmer att omge tecknet
som ska översättas med apostrof tecken ( ' ). För att skapa en char variabel som lagrar bokstaven A skriver vi
bara följande:
char bokstavA = 'A';
För att sedan ta reda på vad tecknet A har för "värde" enligt Unicode tabellen kan vi skriva följande:
int A = bokstavA;
För att lagra tecken 168 enligt Unicode tabellen i variabeln teckenEttSexÅtta skriver vi följande:
char teckenEttSexÅtta = 168;
Operatorer
Eftersom Java har lånat sin syntax direkt från C++, har ni som har erfarenhet av C++ programmering ett litet
försprång. Vi börjar med det som kanske är lättast att förstå, operatorerna. I Java finns följande operatorer +, -,
*, /, = och %. Prioritetsordning är samma som i C++ .
Val
Val är någonting som ofta behöver göras både i vanliga livet och i datorprogram. Det kanske enklaste sättet att
göra val är att använda någonting som kallas för en "if" sats. Den ser ut så här:
if (booleskt uttryck)
{
sats;
sats;
}
else
{
sats;
sats;
}
(booelska uttryck är uttryck som antingen är sanna (true) eller falska (false)).
/PB
Sida 4
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Loopar
I Java finns det tre olika sätt att utföra upprepningar eller loopar som de också kallas.
while
Den enklaste är while loopen. Den ser ut som följande:
while (booleskt uttryck)
{
sats;
sats;
}
while loopen fungerar så här: Om det booleska uttrycket är sant utförs alla satser mellan "måsvingarna". Satserna
fortsätter att utföras i en loop ända tills det booleska uttrycket blir falskt. Om uttrycket är falskt redan från början
utförs INGA av satserna.
do - while
Den andra loopen heter do-while loopen. Enda skillnaden mellan do-while loopen och while loopen är att i dowhile loopen utförs alltid satserna mellan måsvingarna minst en gång. do-while loopen ser ut så här:
do
{
sats;
sats;
}
while (booleskt uttryck);
do-while loopen fungerar så här: Först utförs alla satser mellan måsvingarna en gång, sen kollas om det booleska
uttrycket är sant, och är så fallet fortsätter satserna mellan måsvingarna att utföras ända tills det booleska
uttrycket blir falskt. Om det booleska uttrycket skulle vara falskt redan från början utförs satserna, till skillnad
från den vanliga while loopen, ändå EN gång.
for
Den tredje loopen heter for loopen och används för att utföra någonting ett bestämt antal gånger. For loopen är
den mest komplexa av de tre looparna och ser ut så här:
for (räknarVariabel; booleskt uttryck; ändringAvRäknare)
{
satser;
}
Den fungerar så här: Först lagras eller skapas den räknarVariabel som används till räknaren, sen kollas det
booleska uttrycket och om det är sant utförs satserna mellan "måsvingarna". När loopen gått ett varv utförs
ändringen av räknaren.
for (int i = 0; i<100; i++)
{
sats1; .. sats8;
}
Denna for loop gör så att satserna 1 till och med 8 utförs 100 gånger.
/PB
Sida 5
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Ytterliggare exempel:
import java.util.Scanner;
public class SecondProgram {
public static void main(String[] args) {
int helTal;
double decimalTal, produkt=0;
Scanner sc = new Scanner(System.in);
System.out.println("Hejhopp, min andra Java-applikation!");
System.out.print("Skriv in ett decimaltal(med kommatecken) som
du vill ");
System.out.println("multiplicera med ett heltal.");
decimalTal = sc.nextDouble();
System.out.println("Skriv in heltalet.");
helTal = sc.nextInt();
produkt = decimalTal * helTal;
System.out.println("Produkten = " + produkt );
System.out.println(" ** Svaret kom ut med punkt. Hej då ! ** ");
} //slut på main-funktionen
}
Några kommentarer. För inläsning från skärmen använder vi ett färdigt paket som heter Scanner. Det innehåller
användbara metoder för inmatning av värden till programmet. För att komma åt dessa så skapar vi först ett
objekt, i vårt fall sc, av typen Scanner. När vi har det så kan vi komma åt metoderna som finns i paketet med
punktnotation. Vilka metoder som finns får man läsa om i böcker, webbsidor, och framför allt på Java’s (Sun’s)
egna sidor.
I övrigt kan vi nog lista ut vad programraderna gör.
/PB
Sida 6
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Exempel 3 visar en do-while loop
import java.util.Scanner;
public class ThirdProgram {
public static void main(String[] args) {
int helTal;
double decimalTal, produkt=1;
Scanner sc = new Scanner(System.in);
System.out.println("Hejhopp, min tredje Java-applikation!");
do {
System.out.print("Skriv in ett decimaltal som du vill ");
System.out.println("multiplicera med kommande tal.");
decimalTal = sc.nextDouble();
produkt *= decimalTal;
System.out.println("Produkten = " + produkt );
System.out.println("Vill du fortsätta, Ja=1, Nej=0 ?");
helTal = sc.nextInt();
} while (helTal==1);
System.out.println(" *** Hej då ! *** ");
} //slut på main-funktionen
}
Exempel 4 visar hur man skapar en array, i detta fall för decimaltal
import java.util.Scanner;
public class FourthProgram {
public static void main(String[] args) {
double summa=0;
double[] decimalTal = new double[5];
Scanner sc = new Scanner(System.in);
System.out.println("Hejhopp, min fjärde Java-applikation!");
System.out.println("Skriv in fem heltal som ska adderas. ");
for (int i=0; i<5; i++) {
System.out.print("Skriv in tal "+ (i+1) +" : ");
decimalTal[i] = sc.nextDouble();
}
for (int i=0; i<5; i++) {
summa += decimalTal[i];
}
System.out.println("Summan = " + summa );
System.out.println(" *** Hej då ! *** ");
} //slut på main-funktionen
}
/PB
Sida 7
Värmdö Gymnasium
Datainstitutionen
Programmering B
JAVA Grunder
110118
Övningar
Övning J1.1
Skriv ett program som läser in två heltal och skriver ut förutom produkten av talen även summan. Om du t.ex.
matar in 30 och 10 ska du få följande utskrift:
RESULTAT
============
Produkten : 30 * 10 = 300
Summan : 30 + 10 = 40
Övning J1.2
Läs in tre decimaltal a, b och c och beräkna och skriv ut medelvärdet, (a+b+c)/3.
Övning J1.3
Skriv ett program som läser in två tal och skriver ut det största av dessa två.
Övning J1.4
Skriv ett program som läser in tre tal och skriver ut det största av dessa tre.
Övning J1.5
Skriv ett program som läser in ett okänt antal tal och beräknar dess summa, som skrivs ut.
Tips: t ex om man läser in talet 0 (noll) så hoppar man ur loopen och programmet avslutas.
Övning J1.6
Läs in 10 st tal. Lagra dessa i en array. Läs in ytterligare ett tal, kontrollera och skriv ut hur många av de tidigare
talen som är större än detta tal.
Övning J1.7
Läs in 10 domarsiffror i backhoppning, alla givna med en decimal. Beräkna och skriv ut slutpoängen, som är lika
med medelvärdet av de 8 som är kvar då det största och det minsta värdet tagits bort. Skriv först ut alla de
ursprungliga domarsiffrorna, sen de återstående efter det att man tagit bort det största och minsta.
/PB
Sida 8