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