Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

Typer i programmeringsspråk brukes for å bestemme hva det er lov å gjøre med en verdi eller objekt. Ved å deklarere typen til variabler, parametre, attributter/felt og returverdier til metoder, så kan kompilatoren og utviklingsverktøy sjekke om operasjoner og metoder er brukt riktig (i hvert fall ikke ulovlig).

 

Typer

Typen til en verdi eller et objekt bestemmer hva en kan gjøre med verdien eller et objekt, fdvs. eks. hvilke operasjoner en kan utføre eller metoder en kan kalle. F.eks. kan en bruke + mellom tall og mellom String-objekter, men ikke mellom Date-objekter. For hver type kan en liste opp hva som er lov og ikke, og hvis en gjør noe ulovlig så vil det typisk blir utløst et unntak. Hvis en vet hva slags typer verdier en har å gjøre med i et uttrykk eller setning, så kan en også sjekke at de blir brukt riktig. Og hvis dette kan sjekkes av kompilatoren eller utviklingsverktøyet, så kan en unngå at det blir feil ved kjøring, fordi en nektes å skrive og kjøre kode som ikke er korrekt iht. typene.

...

  • 1 + 2, lov fordi 1 og 2 begge er av typen int, som støtter + (resultatet blir 3)
  • "1" + "2", lov fordi "1" og "2" er av typen String, som støtter + (resultatet blir "12")
  • "1".length(), lov fordi "1" er av typen String og String har metoden length() (uten parametre)
  • "2".charAt(2.0), ikke lov fordi selv om "2" er en String og String har metoden charAt, så tar charAt en int som argument og 2.0 er en double-verdi.
  • ("1" + "2").metodeSomIkkeFinnes(), ikke lov fordi "1" + "2" gir en ny String, og String har ikke metoden metodeSomIkkeFinnes.
  • new Date() + 3, ikke lov fordi new Date() gir et objekt av typen Date, som ikke støtter + (selv om en kunne definert at det skulle gi en ny dato en viss tid fremover)new Date().getYear(), lov fordi new Date() gir et objekt av typen Date, som har metoden getYear()

Typer og uttrykk

Et viktig poeng er at når en vet typen til verdiene/objektene som inngår i et uttrykk (såkalte deluttrykk), så vet en også noe om typen til resultatet. F.eks. vet en at 1 + 2 gir en int fordi int + int generelt en ny int. Dermed vet en også at (1 + 2) + 3 er lov og gir en ny enda en int. Ved å jobbe seg innenfra og ut i et uttrykk, så en dermed finne typen til uttrykket som helhet. F.eks. vil (1 + 2) + "3" gi en String, fordi (1 + 2) gir en int og int + String gir en (ny) String. Dermed er også ((1 + 2) + "3").length() lov, fordi String.length() er lov.

Konvertering av tall

Når en blander talltyper, f.eks. int og double, så har Java regelen at da omgjøres tallene først til samme type, før operasjonen utføres. Og typen Typen som velges er slik at en ikke mister sifre eller desimaler. Ved beregning av 1 + 2.0, altså int + double, så blir int-verdien 1 først omgjort til double-verdien 1.0 før de legges sammen. Hvis en i stedet hadde gjort om double-verdien til int, så kunne en potensielt mistet desimaler og det hadde ikke vært bra.

Konvertering til String ved bruk av +

+-operatoren brukt på String-objekter håndteres spesielt. Hvis typen på minst én side av + er en String, så blir begge sidene omgjort til String ved å kalle String.valueOf, før de spleises sammen. Blanding av + med String, tall og andre tall-operatorer kan være forvirrende og gi feil:

  • "en" + 2 + 3 + "fire" tolkes som (("en" + 2) + 3) + "fire", som gir ((String + int) + int) + String som igjen gir String som gir verdien "en23fire" som resultat.
  • "en" + 2 * 3 + "fire" tolkes som ("en" + (2 * 3)) + "fire", som gir (String + (int * int)) + String som igjen gir String som gir verdien "en6fire" som resultat.
  • "en" + 2 - 3 + "fire" tolkes som (("en" + 2) - 3) + "fire", som gir ((String + int) - int) + String som igjen gir typefeil, siden  String - int ikke er lov.