Java, datatyper

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Datatyper i Java: Primitiva typer, arrayer och objekt

Vi har tre slag av datatyper:

De åtta primitiva typerna

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

Vid en deklaration

int x;

får x defaultvärde (i detta fall, 0).

Några viktiga skillnader mot C/C++:

(Vad gäller för C/C++?)

Typen boolean

Typen representerar ett sanningsvärde. Den genereras av relationsoperatorer (till exempel ==, <). if och while-satser kräver att alla sanningsvärden representeras som boolean.

Mer om boolean.

Om du använder en variabel b som är deklarerad som boolean kan du skriva

if(b) ...
för att testa om b är sann eller
if(!b) ...
för att testa om b är falsk. Du behöver inte jämföra med nåt annat värde.

Om du definierar en metod som returnerar en boolean kan du skriva (till exempel)

boolean even(int n) {
    return n%2==0;
}
Här är det överflödigt att skriva en if-sats.

Typen char

En char är 16 bitar. Java arbetar internt med tecken och strängar i Unicode-representation.

Unicode (http://unicode.org/) är ett ambitiöst projekt som strävar efter att omfatta alla levande och utdöda språk. Naturligtvis kan man inte rymma alla tänkbara tecken i 16 bitar. Istället måste vissa tecken i Unicode representeras med flera char.

Typkonvertering heltal & flyttal

Grundregeln är att ett tal kan automatiskt omvandlas till ett tal av en vidare representation.

(Exempel: int -> long, int -> double, float -> double)

Ett heltal kan omvandlas till en mindre representation via en uttrycklig omvandling.

En heltalsoperation (tex +) returnerar alltid ett värde av typ int eller long.

Så om b är en variabel av typ byte kommer b+1 att vara av typ int. Därför accepteras tilldelningen

b = b + 1

inte av Javas kompilator.

Arrayer i Java: Inte som i C

Det är viktigt att du tar dig tid att studera detta, särskilt om du har stor erfarenhet av C eller C++.

Till skillnad från C gäller att:

Det räcker alltså inte med att deklarera en array, du måste skriva programkod för att skapa arrayen.

Så här kan det se ut när man deklarerar en array och initierar den:

int[] a = new int [10];

Om du vill kan du ersätta storleken (10) med ett uttryck så att storleken bestäms vid körning. Här måste man skilja på variabeln a som referererar till arrayen, och den datastruktur som skapas när man utför new int [10] . Variabeln a kan referera till olika arrayer under körning så man kan säga att storleken är dynamisk. Det går dock inte att ändra storleken på en array. När en array har skapats behåller den sin storlek.

Vid indexering av arrayer kontrolleras index. Om arrayen a har skapats enligt ovan (med 10 element) kommer de här uttrycken att ge felmeddelanden:

a[-1] a[10]

Arrayer, initiering

Man kan initiera en array genom att ange dess initialvärde:

int[] a = {1, 2, 3};

Initialvärdena kan beräknas vid körning:

int[] a = {1, n+1, 2*n, n*n};

Arrayer, tilldelning

Betrakta

int[] a = new int [10]; int[] b = a;

a och b refererar till samma array!

"null" står för ingen array.

int[] a = null; betyder samma sak som

int[] a;

Arrayer, length

Storlek på array ges av .length.

   int[] a = new int[10];
   int x = a.length;
   a = new int[100];
   int y = a.length;

I exemplet tilldelas x värdet 10 och y värdet 100.

Exempel: Byt värde på två array-variabler

Ett exempel på nåt som är enkelt att göra i Java men är svårt i C/C++.

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]);
}

Vad skrivs ut?