De åtta primitiva typerna Java, datatyper, kontrollstrukturer Skansholm: Kapitel 2) Uppsala Universitet 11 mars 2005 Typ Innehåll Defaultvärde Storlek boolean true, false false 1 bit char Tecken \u000 16 bit byte Heltal 0 8 bit short Heltal 0 16 bit int Heltal 0 32 bit long Heltal 0 64 bit float Flyttal 0.0 32 bit double Flyttal 0.0 64 bit Objectorienterad programmering Sida 1 Objectorienterad programmering Sida 3 Datatyper i Java: Tre slag Primitiva: Sanningsvärden, tecken, heltal, flyttal (8 stycken) Arrayer (nästan inte alls som i C) Objekt Typen boolean 1. representerar ett sanningsvärde 2. genereras av relationsoperatorer (tex ==, <) 3. if och while-satser kräver att alla sanningsvärden representeras som boolean Objectorienterad programmering Sida 2 Objectorienterad programmering Sida 4
Typen char Ett tecken i Unicode. Heltalstyper, exempel 16 bitar. char back = \b ; byte b = 42; short s = 4711; int i = 1000000000; //En miljard char tab = \t ; s = b; // OK; s = (short)i; // s == -13824 char A = A ; char A = \101 ; char A = \u0041 ; char A = (char)65; i = i + i; // OK; två miljarder i = i + i; // i == 294967296 Objectorienterad programmering Sida 5 Objectorienterad programmering Sida 7 Heltalstyper Typ Antal bitar Min Max byte 8 128 127 short 16 32768 32767 int 32 2 31 2 31 1 long 64 2 63 2 63 1 Heltalstyper, regler Ett värde av heltalstyp kan automatiskt omvandlas till ett heltal av en större representation. Ett heltal kan omvandlas till en mindre representation via en uttrycklig omvandling, Aritmetiska operatorer (tex +) returnerar alltid ett värde av type int eller long. b = b + 1 är ej korrekt om b är en byte. Objectorienterad programmering Sida 6 Objectorienterad programmering Sida 8
Logiska operatorer Flyttal (Skansholm: reella tal) Typ Strl Max Noggrannhet float 32 3,4 10 38 7 siffror double 64 1,7 10 308 15 siffror Logiska operatorer används tillsammans med jämförelseoperatorer för att skapa mer komplexa uttryck. Både operanderna och resultatat är av typen boolean. op1 && op2 op1 op2 och eller! op inte op1 & op2 op1 op2 op1 ^ op2 och eller xor, är op1 och op2 olika Med && evalueras op2 endast om op1 är sann. Objectorienterad programmering Sida 9 Objectorienterad programmering Sida 11 Jämförelseoperatorer Båda operanderna är en primitiv typ, resultatet är boolean op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 likhet op1!= op2 olikhet Blanda inte ihop == och =. Bitvisa operatorer All operander och resultat är heltal. op1 >> op2 op1 shiftas op2 bitar till höger op1 << op2 op1 shiftas op2 bitar till vänster op1 & op2 bitvis and op1 op2 bitvis or op1 ^ op2 bitvis xor ~op2 bitvis komplement (not) Objectorienterad programmering Sida 10 Objectorienterad programmering Sida 12
Arrayer (Skansholm: fält) Arrayer i Java: Inte som i C Att deklarera en array int[] a; eller int a[]; a = new int[100]; skapar en array med elementen a[0]... a[99] Att updatera element a[42] = 3; Att läsa ett element int x = a[42]; arrayer skapas explicit storlek anges dynamiskt index testas int[] a = new int [10]; a[-1] och a[10] ger felmeddelande! inititiering int[] a = {1, 2, 3; men även int[] a = {1, n+1, 2*n, n*n; Objectorienterad programmering Sida 13 Objectorienterad programmering Sida 15 Arrayer: Ett enkelt exempel int n =... int a[] = new int[n]; Inte som i C (forts) Tilldelning int[] a = new int [10]; int[] b = a; for (int i = 0; i < n; i++) { a[i] = i; int s = 0; for (int i = 0; i < n; i++) { s = s + a[i]; System.out.println("s = " + s); a och b refererar till samma array! Storlek på array ges av.length. int[] a = new int[10]; int x = a.length; a = new int[100]; int y = a.length; Objectorienterad programmering Sida 14 Objectorienterad programmering Sida 16
Deklarationer i Java Inte som i C (forts) null står för ingen array. int[] a = null; betyder samma sak som int[] a; En variabel deklareras med typ var; eller typ var = init; En deklaration behöver inte stå först. En deklarerad variabel får inte deklareras igen. init kan vara ett godtyckligt uttryck. Identifierare får innehålla å, ä, och ö! (Men ibland blir det strul när man flyttar program mellan olika OS, så undvik att använda svenska bokstäver i uppgifterna.) Objectorienterad programmering Sida 17 Objectorienterad programmering Sida 19 Exempel: Byt värde på två array-variabler static void main (String args[]) { int[] a = {1,2,3; int[] b = {99, 98, 97, 93, 92, 91; int[] temp; temp = a; a = b; b = temp; System.out.println("b[0] = " + b[0]); if (i>0) { x = x + 1; else { y = y + 1; while(s<10) s = s + 7; Kontrollstrukturer, exempel for (int i = 0; i<10; i++) { a[i] = 0; Objectorienterad programmering Sida 18 Objectorienterad programmering Sida 20
Lite om strängar I Java är strängar objekt av en speciell klass String ; inte en primitiv datatyp och inte heller en array. Tecknen i en sträng är av char -typ, dvs Unicode-tecken. Objekt av typ String är konstanta man kan inte ändra i en sträng. (Det finns en klass StringBuffer som tillåter ändringar.) Man kan skapa ett nytt sträng-objekt med syntaxen "En sträng". Strängar, jämförelse Notera att två strängar kan ha samma innehåll utan att vara identiska. Operatorn == testar om två referenser är till samma objekt. För att testa om två strängar har samma innehåll, skriv (tex) s1.equals(s2) Objectorienterad programmering Sida 21 Objectorienterad programmering Sida 23 Strängar (forts) Jämförelse av strängar, exempel Strängar slås ihop (konkateneras) med +. Om a och b är strängar så returnerar uttrycket a + b en ny sträng som är konkateneringen av a och b. Om det ena argumentet till + är ett String-objekt, så omvandlas det andra till en sträng. Exempel: int x = 42; System.out.println("Shoesize: " + x); Resultat: Shoesize: 42. String a = "java.1.4.2"; String b = new String("java.1.4.2"); //Tvinga kompilatorn att skapa ett nytt objekt! System.out.println("a==b : " + (a==b)); System.out.println("a.equals(b) : " + (a.equals(b))); ger utskriften a==b : false a.equals(b) : true Objectorienterad programmering Sida 22 Objectorienterad programmering Sida 24
Sammanfattning Java har tre slag av datatyper: primitiva (heltal, flyttal, char, boolean) arrayer klasser primitiva typer fungerar ungefär som i C/C++. arrayer är lite annorlunda; alla index testas, allokering sker explicit. Strängar är objekt i en fördefinierad klass. Objectorienterad programmering Sida 25