INTRODUKTION TILL PROGRAMMERING Föreläsning 6 (9.1.2006) INNEHÅLL: Primitiva datatyper Referenstyper Arrayer Strängar Klasser och instansvariabler Utmatning på bildskärmen Inmatning från tangentbordet Jonny Karlsson 11.10.2005
Datatyper Datatyperna i Java är i stora drag samma som i C. Java definierar dock ett antal nya datatyper som inte finns i C. I Java finns två olika slags datatyper: Primitiva datatyper Referenstyper Jonny Karlsson 11.10.2005
Primitiva datatyper i Java En primitiv datatyp är en datatyp som finns definierat i språket från början. Primitiva datatyper i Java Namn Utrymme i minnet Värden * byte 8 bitar (1 byte) -27 till + 27 – 1 * short 16 bitar (2 byte) -215 till + 215 – 1 int 32 bitar (4 byte) -231 till + 231 – 1 long 64 bitar (8 byte) -263 till + 263 – 1 char Tecken i Unicodcode tabellerna * boolean true eller false float -3,40292347*1038 till +3,40292347*1038 double -1,79769313486231570*10308 till +1,79769313486231570*10308 * = Finns ej i C Jonny Karlsson 11.10.2005
Referenstyper En referenstyp kan vara en arraytyp, klasstyp eller gränssnittyp. Dessa typer behandlas i vissa viktiga avseenden annorlunda än de primitiva datatyperna. Ett värde i en referenstyp kallas för objekt Referenstyperna kan i princip bli hur många som helst eftersom de kan skapas av programmeraren efterhand Jonny Karlsson 11.10.2005
Arrayer (”arrays”) En array är en tabell/vekor som är en ändling följd av primitiva värden eller objekt där alla ingående värden har samma typ. Fungerar lika som tabeller i C, fast de skapas på ett lite annorlunda sätt. Man undviker i Java att tala om vektorer för att undvika sammanblandning med klassen vector. Värden i en array kallas för medlemmar. Jonny Karlsson 11.10.2005
Deklaration av Array-variabler int [ ] a; eller int a [ ]; Detta deklarerar variabeln a som är en array av typen int. Variabeln a är egentligen en referens till en array och specificerar ingen längd på arrayen. Jonny Karlsson 11.10.2005
Skapande av arrayer Till skillnad från primitiva datatyper (t.ex. int) måste en array skapas (liksom andra referenstyper) innan ett värde kan tilldelas en medlem. a = new int[10]; En array med plats för 10 värden av typ int skapasoch a knyts till denna array. new är ett nyckelord som används för att skapa nya objekt. Förstå skillnaden mellan variabler av primitiv typ och referenstyp: x = 360; //värdet 360 skrivs in i variabeln x dvs. den plats i minnet som betecknas //med x a = new int[10] //En array med plats för 10 heltal skrivs ej in i a, utan a tilldelas en //referens/pekare/handtag till arrayen som finns på en helt annan //plats i minnet Variablen a ovan berättar alltså på vilken plats i minnet arrayen finns. Jonny Karlsson 11.10.2005
Skapande av arrayer När man skapar en array med nyckelordet new initialiseras automatiskt alla medlemmar av arrayen till ett visst värde. Exempel: int tab[] = new int[5]; //alla 5 medlemmarna i arrayen tab initialiseras till 0. Samma //gäller även andra tabeller av numerisk typ. Längden på en array kan i programkoden fås med: a.length För övrigt hanteras arrayer i Java på samma sätt som tabeller i C. Jonny Karlsson 11.10.2005
Strängar Definierar en ändling följd av tecken. I Java ugör strängar en klass kallad String. Klassen String innehåller en stor samling metoder för att manipulera strängar (en del av dessa tas upp lite senare) Till skillnad från strängar i C (char[ ]) är strängar i Java (String) oföränderliga, dvs. när en sträng skaptats kan den ej längra förändras utan i stället måste en ny sträng skapas. Jonny Karlsson 11.10.2005
Strängar En sträng deklareras enligt följande: String s; En sträng deklareras och initialiseras: String s2 = ”Kalle Anka”; En sträng tilldelas ett värde: s2 = ”Musse Pigg”; Jonny Karlsson 11.10.2005
Strängar Två strängar kan konkateneras/slås ihop med + operatorn: String str1 = ”Kalle”, str2 = ”Anka”; nystring = str1 + str2; //innehållet i nystring blir ”KalleAnka”; Två strängar kan jämföras m.h.a. instansmetoden equals() definierad i klassen String. Denna metod returnerar ett värde av typ boolean. Om jämförelseträngen man ger som parameter till metoden equals() är identisk med den sträng man jämför med, returneras värdet true, i annat fall värdet false. Se exemplet nedan: String s = ”pelle”; If(s.equals(”pelle”) == true) //denna if-sats blir ”true” if(s.equals(”ville”) == true) //denna if-sats blir ”false” Jonny Karlsson 11.10.2005
Klasser Alla värden som hanteras i Java är antingen primitiva typer eller referenstyper. Referenstyper kallas vanligen objekt Ett objekt kan antingen vara en array eller tillhöra någon i ett program (eller bibliotek) definierad datatyp. Dessa definierade typer kallas för klasser. Ett värde (objekt) som hör till en viss klass kallas för en instans av klassen. Jonny Karlsson 11.10.2005
Klasser Exempel: String s; En ny variabel s deklareras ovan som är av typen String. String är en klass som definierar strängar och s blir nu ett nytt objekt eller en instans av klassen String. String är ett exempel på en klass som finns färdigt definierad i Java. Jonny Karlsson 11.10.2005
Att skapa egna klasser Klasser kan även vid behov deklareras av programmeraren själv. En ny klass kan deklareras i en skild källkodsfil eller i samma källkodsfil som innehåller huvudklassen med tillhörande huvudfunktion (”main”-funktion). Tillsvidare behandlar vi hur man deklarerar klasser i samma källkodsfil. Jonny Karlsson 11.10.2005
Att skapa egna klasser En egen klass i samma källkodsfil som huvudklassen deklareras enligt följande: public class mittJavaProg { public static void main(String args[ ]) } class Minklass Observera att huvudklassen och endast huvudklassen skall ha nyckelordet public. Huvudklassens namn bör vara samma som källkodsfilens namn. Jonny Karlsson 11.10.2005
Klasser Vår tidigare deklarerade klass ”Minklass” var för enkelhetens skull en tom klass som varken gör någonting eller innehåller variabler. En klass kan innehålla bl.a. instansvariabler och instansmetoder. Tillsvidare går vi endast igenom instansvariabler. Jonny Karlsson 11.10.2005
Klasser: instansvariabler Exempel: Vi behöver ett program som hanterar olika egenskaper av en människa. Dessa egenskaper kan för enkelhetens skull nu vara endast födelseår och namn. Då skulle vi deklarera en ny klass för människa med två instansvariabler födelseår (int) och namn (String): class Manniska { int fodelsear; String Namn; } Observera att klassen ovan påminner om poster i C Jonny Karlsson 11.10.2005
Klasser: skapa klassinstans/objekt Om vi nu från huvudklassens huvudfunktion vill skapa en ny människa och till den nya människan tilldela ett värde för födelseår och ett värde för namn gör vi enligt följande: public class mittJavaProg { public static void main(String args[ ]) Manniska kalle; //Deklarerar en variabel ”kalle” av typen //”Manniska” kalle = new Manniska(); //skapar en instans av klassen ”Manniska”. //Adressen/referensen till klassen tilldelas //variabeln kalle. } Jonny Karlsson 11.10.2005
Klasser: syftningsoperator Efter detta kan den egna klassens instansvariabler kommas åt m.h.a. punktnotation (precis som vid användning av poster i C): kalle.fodelsear = 1977; kalle.namn = ”Karl Karlsson”; Punktteknet som används här kallas i Java för syftningsoperator Jonny Karlsson 11.10.2005
Utmatning på bildskärmen Utmatning av data på bildskärmen kan i DOS-baserade Java program göras med: System.out.println(); Statiska tecken matas ut enligt följande: System.out.println(”Hej på er alla”); Utskrift av specialtecken och radbrytstecken fungerar lika som med funktionen printf i C: System.out.println(”\”Att vara eller icke vara\” sade Shakespear\n”); println sätter automatiskt in ett radbrytstecken i slutet av varje sats. Jonny Karlsson 11.10.2005
Utmatning på bildskärmen Utmatning av variabelvärden: int tal = 599; String s = ”Pekka” System.out.println(tal); //skriver ”599” på bildskärmen System.out.println(s); //skriver ”Pekka” på bildskärmen Variabler och statisk text kan slås ihop i en println-sats m.h.a. + operatorn: System.out.println(”Namnet på gubben är: ” + s); //skriver ”Namnet på gubben är: //Pekka” på bildskärmen System.out.println(s + ” är ” + tal + ” år gammal”); //skriver ”Pekka är 599 år gammal” på //bildskärmen Jonny Karlsson 11.10.2005
Inmatning från tangentbordet Inte lika enkelt som utmatning till bildskärmen. Vissa element behövs för att kunna läsa in information som man skriver in från tangentbordet: InputStreamReader BefferedReader Eftersom innebörden i ovanstående element kräver mer kunskap i programmering än vi hittils fått, nöjer vi oss tillsvidare med att endast lära oss hur syntaxen ser ut för att få inmatningen från tangentbordet att fungera: Följande rad bör sättas in någonstans i början av main funktionen: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Jonny Karlsson 11.10.2005
Inmatning från tangentbordet Klassbiblioteket java.io.* måste importeras för att få inläsningsfunktionerna att fungera. (Detta kan jämföras med att inkludera biblioteksfiler i C). Importeringar av klassbibliotek sker alltid först i källkodsfilen: import java.io.*; Efter detta kan man använda metoden readLine() via objketet/instansen in för att läsa in data från tangentbordet: in.readLine(); Användning av readLine() metoden kräver att metoden varifrån readLine() anropas skall definieras att antingen hantera eller ignorera IO felmeddelanden. Se exemplet på följande sida. Jonny Karlsson 11.10.2005
Inläsning av strängar Metoden readLine() returnerar det data användaren matat in från tangentbordet i String format. Man kan således lätt läsa in data från tangenbordet till en String instans: import java.io.*; public class minklass { public stativ void main(String args[]) throws IOException BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String s; s = in.readLine(); } Jonny Karlsson 11.10.2005
Inläsning av numeriska värden Är lite mer komplicerat än inläsning av heltal i C eftersom man i DOS-baserade Java program inte direkt kan läsa in ett heltal och spara talet i en heltalsvariabel. readLine() metoden returnerar alltid inmatat data från tangenbordet i String format. Man måste därför konvertera datat till ett heltal innan datat kan sparas i en heltalsvariabel. För att konvertera data från String till int kan man utnyttja en klass som heter Integer och en av dess instansmetoder, parseInt: BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String text; int heltal; text = in.readLine(); int heltal = Integer.parseInt(text); Jonny Karlsson 11.10.2005
Inläsning av numeriska värden På samma sätt som man konverterar teckensträngar till heltal kan man konvertera teckensträngar till flyttal (float) m.h.a.: klassen Float och instansmetoden parseFloat. och teckensträngar till större flyttal (double) m.h.a.: klassen Double och instansmetoden parseFloat. Jonny Karlsson 11.10.2005