wrapperklassene

Embed Size (px)

Citation preview

  • 8/14/2019 wrapperklassene

    1/27

    1

    Lringsml for forelesningen

    Java-programmering Tall-klasser i Java

    Andre wrapper-klasser

    Eclipse bruk av scrapbookfor evaluering og utfrelse av

    kodesnutter

  • 8/14/2019 wrapperklassene

    2/27

    2

    Tall i Java (1)

    Java har sttte for en rekke typer tall,

    hvorav de vanligste er int og double

    I motsetning til ideelle matematiske tall, s

    vil tall representert vha. 0 og 1 ha unskede

    egenskaper

    Heltall, f.eks. int, har et begrenset tallomrde (+-2 ^ 31) Desimaltall, f.eks. double, har begrenset tallomrde og

    nyaktighet

  • 8/14/2019 wrapperklassene

    3/27

    3

    Tall i Java (2)

    Nr en bruker tall, kan en velge mellomflere typer enn int og double, med ulike

    begrensningerbyte, short, int og long er heltall med tallomrde begrensetav antall bit:byte bruker 8 bit, short 16, int 32 og long 64.

    Det er sjelden grunn til bruke noe annet enn int, som dekker +-(2^31)

    float og double er s

    kalte flyttall, som gir mulighet for b

    destrre tall og desimaltall. Nyaktigheten er imidlertid begrenset og

    dess strre tallet er, dess mindre nyaktig blir det.Det er sjelden grunn til bruke noe annet enn double, nr ennsker utfre tekniske beregninger som krever desimaltall.

  • 8/14/2019 wrapperklassene

    4/27

    4

    Tall i Java (3)

    Hva skjer nr en blander talltyper? f.eks. byte + int, float + double eller int + double

    Merk at tall i koden er av typen int og at det finnes egen syntaks for andre tall.

    Java konverterer automatisk til int eller double, slik at enikke mister tallomrde eller nyaktiget under beregningen.

    byte + int blir til int + int

    int + double og float + double blir til double + double

    Hva skjer nr svaret

    skal konverteres tilbake? Vi m tvinge frem en

    konverting vha. casting, noe som kan gi feil resultat!

  • 8/14/2019 wrapperklassene

    5/27

    5

    Bit-representasjon av heltall

    byte-typen bruker 1 byte = 8 bit 00000000 = 0, 00000001 = 1, 00000010 = 2, ...

    01111111 = 127, 10000000 = -128 11111111 = -1, 11111110 = -2, 11111101 = -3, ...

    short-typen bruker 2 byte = 16 bit 0000000000000000 = 0, 0000000000000001 = 1, ...

    0111111111111111 = 2 ^ 15 1 = 32767 1000000000000000 = -(2 ^ 15) = -32768

    1111111111111111 = -1, 1111111111111110 = -2, ...

    int bruker 4 byte/32 bit og long 8 byte/64

    bit

  • 8/14/2019 wrapperklassene

    6/27

    6

    Konvertering

    Ved konvertering klippes de verste

    bitene bort (int)256 = 100000000 => (byte)0

    (int)255 = 011111111 => (byte)-1

    Fordel: tall innenfor gyldig tallomrde ser like ut:

    (int)-1 == (byte)-1

  • 8/14/2019 wrapperklassene

    7/27

    7

    Tall som verdier

    Tall-typer som int og double er skalte

    primitive typer

    Det er stort sett dette vi har brukt s langt!

    Primitive typer skiller seg fra referansetyper (som peker til

    objekter)

    ingen identitet, metoder eller felter for primitive typer bare en

    verdi som variabelen inneholder

    Begrensninger ved tall-typer Tall-typene har ingen supertype tilsvarende Object, slik at en alltid

    m deklarere tall-variabler som en spesifikk talltype

    Collection-objekter kan ikke inneholde vanlige tall, nettopp fordi

    de ikke er objekter

    int heltall = 3

    double desimaltall = 3.14

  • 8/14/2019 wrapperklassene

    8/27

    8

    Tall som

    objekter Java har egne objektvarianter av tall, tegn og logiske

    verdier, slik at de kan tilordnes variabler av typen Object(og Object-tabeller) og hndteres av Collection-objekter

    int har sin Integer-klasse, boolean sin Boolean-klasse, char sin Character-klasse, osv.

    List er ikke lov, en m bruke List

    En kan lage nye tall-objekter p essensielt tre mter: Integer intObjekt1 = new Integer(4); // new-operatoren

    Integer intObjekt2 = Integer.valueOf(4); // statisk metode som tar int-parameter

    Integer intObjekt3 = Integer.valueOf(4); // (overlagret) statisk metode som tarString-parameter

    Et tall-objekt er skalt immutable, dvs. ikke mulig endre.Dermed er det ikke noe farlig dele referanser til tall-objekter.

    Integer heltall =

    Double desimaltall =

    3

    3.14

  • 8/14/2019 wrapperklassene

    9/27

    9

    Tall vs. tallobjekter

    En int er verdientil attributtet

    En Integer er eteget object, ogdet er referansen

    til objektet som er attributtets verdi Hvorfor trenger en noen ganger

    bruke Integer-attributter (og ikke int)?

    #1: MinKlasse

    int i = 3

    #1: MinKlasse

    Integer i

    #2: Integer

    3

  • 8/14/2019 wrapperklassene

    10/27

    10

    Tall-objekter og identitet

    Like tall-objekter kan vre forskjellige objekter: new Integer(4) != new Integer(4) new Integer(4) != Integer.valueOf(4) Integer.valueOf(4) == Integer.valueOf(4)

    Integer.valueOf(4) != Integer.valueOf(4) Integer.valueOf(12345) != Integer.valueOf(12345)

    new Integer(i) lager alltid et nytt objekt Integer.valueOf(i) lager noen ganger et

    nytt objekt og returnerer noen ganger et eksisterende et

    Integer.valueOf(s) ser ut til lage et nytt objekt

    Ikke regn med at to like tall er identiske eller omvendt!

    Merk at String oppfrer seg p en lignende mte! f.eks. Hall + vard == Hallvard gir true

  • 8/14/2019 wrapperklassene

    11/27

    11

    Eclipse sin scrapbook-

    mekanisme Sakset fra Hjelpesystemet til Eclipse:

    The Java Development Toolkit (JDT) contributesa scrapbook facility that can be used toexperiment and evaluate Java code snippetsbefore building a complete Java program

    En scrapbooker en jpage-fil, med tilhrendeEclipse-editor.

    Snutter med Java-kode kan kjres ogenkeltuttrykk kan evalueres, uten mtte lage enklasse med en main-metode.

  • 8/14/2019 wrapperklassene

    12/27

    12

    Opprette en scrapbook

    Hyreklikk pmappe/pakke, velg New->Other... og deretterScrapbook Page

  • 8/14/2019 wrapperklassene

    13/27

    13

    Evaluere kode i en scrapbook (1)

    Velg kodesnutten og deretter

    Evaluate-knappen

    Resultatet legges inn bak snutten

  • 8/14/2019 wrapperklassene

    14/27

    14

    Evaluere kode i en scrapbook (2)

    Velg kodesnutten og deretter

    Inspect-knappen

    Resultatet vises i et eget popup-vindu

  • 8/14/2019 wrapperklassene

    15/27

    15

    Utfre kode i en scrapbook

    Velg kodesnutten og deretter

    Execute-knappen

    Resultatet vises implisitt i konsollet

  • 8/14/2019 wrapperklassene

    16/27

    16

    Number-klassen

    Number-klassen er superklassen til alle de spesifikke tall-klassene (Byte, Short, Integer, Long, Float, Double)

    Number (er en abstraktklasse som) spesifiserer

    (abstrakte) metoderfor

    konvertere til spesifikketalltyper: byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()

    Hver heltallsklasse har nyttige attributter og metoder Integer.toString(int) lager en String av en int, tilsvarende

    Integer.valueOf(int).toString(), men uten lage et Integer-objekt

    Integer.MIN_VALUE og Integer.MAX_VALUE er statiske attributtersom er satt til hhv. minste og strste mulige int-verdier

    Alle tall-klassene (alts Number-subklasser)implementerer Comparable og dermed compareTo-metoden, slik at tall kan sorteres.

  • 8/14/2019 wrapperklassene

    17/27

    17

    Konvertering mellom

    tall og tall-objekter (1)

    For lagre tall i Collection-objekter (oggenerelt nr en trenger en Object ellerNumber-referanse), m tall gjres om til

    tall-objekter // kan ikke alltid bruke int[]List list = ArrayList();list.add(Integer.valueOf(13));list.get(0) gir en Integer

    Java 1.5 har sttte for automatiskkonvertering mellom tall-objekter ogtilsvarende talltype (bde frem og tilbake)

  • 8/14/2019 wrapperklassene

    18/27

    18

    Konvertering mellom

    tall og tall-objekter (2)

    Konvertering skjer automatisk nr

    deklarasjonene gjr det helt tydelig hva

    slags type vi har og forventer Nr intObjekt er deklarert som en Integer vil

    intObjekt = 1 oversettes til intObjekt =

    Integer.valueOf(1)

    int n = intObjekt * 2 oversettes til

    int n = intObject.intValue() * 2

    Nr list er deklarert som List vil

    list.add(n) oversettes til

    list.add(Integer.valueOf(n)) og

    list.get(i) oversettes til list.get(i).intValue()

  • 8/14/2019 wrapperklassene

    19/27

    19

    Konvertering mellom

    tall og tall-objekter (3)

    Kan en bruke List og unng

    konverteringen?

    -deklarasjoner gjelder kun for

    subklasser av Object

    Kan en bruke List,

    nr en ikke vet spesifikt hva slags talltyper

    en har?

    Nei, konvertering skjer kun for spesifikke

    tall-klasser, som Integer og Double.

  • 8/14/2019 wrapperklassene

    20/27

    20

    Ikke bruk tall-objekter ukritisk

    Tall-objekter brukes i tre tilfeller nr en m blande ulike talltyper eller talltyper og andre objekt-typer

    nr en nsker bruke Collection-rammeverket sammen med tall (bdeCollection- og Map-subklasser)

    nr en nsker skille mellom ikke-noe-tall (null) og en gyldig tall-verdi

    Automatisk konvertering (skalt autoboxing) haren kostnad

    automatisk generert konverteringskode tar tid

    tall-objekter tar ogs plass og tid opprette og kaste:

    List talliste = new ArrayList();talliste.add(1); talliste.add(1);for (int i = 2; i < 100; i++) {

    talliste.add(i, talliste.get(i-2) + talliste.get(i-1));}

  • 8/14/2019 wrapperklassene

    21/27

    21

    boolean/Boolean og char/Character

    Objekt-motstykket til boolean er Boolean brukes typisk nr en skal lagre logiske verdier blant andre typer objekter

    Siden en kun trenger to slike objekter, tilsvarende true og false, harBoolean to statiske attributter TRUE og FALSE

    Boolean.TRUE == true og Boolean.valueOf(true) == Boolean.TRUE Boolean. FALSE == false og Boolean.valueOf(false) == Boolean.FALSE

    Det meste av det som er sagt om konvertering mellom tallog tall-objekter, gjelder ogs for boolean/Boolean ogchar/Character

    konvertering skjer automatisk nr deklarasjonene er der, f.eks. gittList bs = new ArrayList();bs.add(2 == 0) oversettes til bs.add(Boolean.valueOf(2 == 0))

    if (Boolean.TRUE) { ... } oversettes tilif (Boolean.TRUE.booleanValue()) { ... }

    List cs = new ArrayList();cs.add(#) oversettes til cs.add(Character.valueOf(#))

  • 8/14/2019 wrapperklassene

    22/27

    22

    Desimaltallsberegninger

    Tre merkelige desimaltall NaN (not a number), resultatet av umulige

    beregninger Math.sqrt(-1.0) returnerer NaN

    Merk at NaN != NaN, f.eks. Math.sqrt(-1.0) != Math.sqrt(-1.0)

    Alle operasjoner med NaN som operand gir NaN,

    dvs. har du frst ftt NaN, s fr du aldri noe annet

    Infinity (uendelig) og -Infinity (negativ uendelig)

    1.0 / 0.0 gir Infinity, 1.0 / -0.0 gir Infinity

    (1.0 / -0.0) + (1.0 / 0.0) gir NaN

  • 8/14/2019 wrapperklassene

    23/27

    23

    Desimaltallsberegninger

    Unyaktigheter i tallrepresentasjonen

    gjr at beregninger blir unyaktige, s

    ikke bruk == ved sammenligning av

    desimaltall, men sjekk om tallet er

    innenfor et lite interval(d1 epsilon < d2) && (d2 < d1+epsilon)

    hvor epsilon er et veldig lite tall,

    jfr. assertEquals(double, double, double)

  • 8/14/2019 wrapperklassene

    24/27

    24

    Flere tallklasser

    I tillegg til Integer, Double osv. som harmotstykkene int, double osv., s har Java totallklasser med ubegrenset tallomrde

    java.math.BigInteger er heltall med ubegrenset strrelse java.math.BigDecimal er tilsvarende for flyttall

    Begge er subklasser av java.lang.Number, som de andre tall-klassene

    Disse klassene lar en jobbe med kjempestore tall(som kan ta mye plass og tid operere p)

    Noen typer tallteoretiske og numeriskeanvendelser kan dra nytt av disse, f.eks. letingetter store primtall ifm. kryptering.

  • 8/14/2019 wrapperklassene

    25/27

    25

    BigInteger-eksempel

    List tall = new ArrayList();tall.add(1);tall.add(1);for (int i = 2; i < 100; i++) {

    tall.add(i, tall.get(i-2) + tall.get(i-1));}

    Konverteres til:

    List tall = newArrayList();tall.add(BigInteger.valueOf(1));tall.add(BigInteger.ONE);for (int i = 2; i < 100; i++) {

    tall.add(i, tall.get(i-2).add(tall.get(i-1)));}

  • 8/14/2019 wrapperklassene

    26/27

    26

    String-objekter ligner p

    tall-objekter Et String-objekt kan ikke endres, dvs. det finnes ingen endringsmetoder

    String-objekter lages som regel implisitt, fra konstanter eller uttrykk

    Sammenligning med == kan vre uforutsigbart, bruk equals

    Ved ukritisk bruk kan en lage fryktelig mange String-objekter uten at en er

    klar over det:BufferedReader reader = String result = "";while (reader.ready()) {

    result = result + reader.readLine();}

    Ved trinnvis bygging av String-objekter er det bedre bruke StringBuffer

    (=1.5), f.eks. slik:BufferedReader reader = StringBuilder result = new StringBuilder();while (reader.ready()) {

    result.append(reader.readLine());}

  • 8/14/2019 wrapperklassene

    27/27

    27

    Lringsml for forelesningen

    Java-programmering Tall-klasser i Java

    Andre wrapper-klasser

    Eclipse bruk av scrapbookfor evaluering og utfrelse av

    kodesnutter