1. Typecasting
Variabler av primitiva typer (med undantag för boolean
typen) används för att lagra olika typer av tal. Även om typerna av variabler aldrig ändrades, finns det en plats där du kan konvertera från en typ till en annan. Och den platsen är uppdrag .
Variabler av olika typer kan tilldelas varandra. När du gör detta konverteras värdet av en variabel av en typ till ett värde av en annan typ och tilldelas den andra variabeln. I detta avseende kan vi identifiera två typer av typkonvertering: breddning och avsmalning.
Att bredda är som att flytta ett värde från en liten korg till en stor: denna operation är sömlös och smärtfri. Avsmalning händer när du flyttar ett värde från en stor korg till en liten: det kanske inte finns tillräckligt med utrymme och du måste slänga något.
Här är typerna, sorterade efter korgstorlek:
2. Breddande typkonverteringar
Det är ofta nödvändigt att tilldela en variabel av en numerisk typ till en variabel av en annan numerisk typ. Hur gör man det?
Java har 4 heltalstyper:
Typ | Storlek |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
Variabel lagrad i mindre korgar kan alltid tilldelas variabler lagrade i större korgar.
int
, short
och byte
variabler kan enkelt tilldelas till long
variabler. short
och byte
variabler kan tilldelas int
variabler. Och byte
variabler kan tilldelas short
variabler.
Exempel:
Koda | Beskrivning |
---|---|
|
Den här koden kommer att kompileras bra. |
En sådan omvandling, från en mindre till en större typ, kallas en omvandling av breddningstyp .
Hur är det med reella siffror?
Med dem är allt sig likt - storleken spelar roll:
Typ | Storlek |
---|---|
float |
4 bytes |
double |
8 bytes |
float
variabler kan tilldelas double
variabler utan problem. Men saker och ting är mer intressanta med heltalstyperna.
Du kan tilldela vilken heltalsvariabel som helst till en float
variabel. Även long
typen, som är 8 byte lång. Och du kan tilldela vad du vill - vilken heltalsvariabel eller float
variabel som helst - till en double
variabel:
Koda | Notera |
---|---|
|
|
Observera att konvertering till en riktig typ kan resultera i förlust av precision på grund av bristen på tillräckligt med signifikanta siffror.
När du konverterar från heltal till flyttal, kan de lägre ordningens delar av tal kasseras. Men eftersom bråktal förstås lagra ungefärliga värden, är sådana tilldelningsoperationer tillåtna.
3. Begränsande typkonverteringar
Hur är det med de andra möjligheterna? Vad händer om du behöver tilldela ett long
värde till en int
variabel?
Föreställ dig en variabel som en korg. Vi har korgar i olika storlekar: 1, 2, 4 och 8 byte. Det är inga problem att flytta äpplen från en mindre korg till en större. Men när man byter från en större korg till en mindre kan en del av äpplena gå förlorade.
Denna omvandling – från en större typ till en mindre typ – kallas en avsmalnande typkonvertering . När du utför en tilldelningsoperation som denna kanske en del av ett nummer helt enkelt inte passar in i den nya variabeln och kan därför kasseras.
När vi begränsar en typ måste vi uttryckligen tala om för kompilatorn att vi inte gör ett misstag, att vi medvetet kasserar en del av numret. Typecast-operatorn används för detta. Det är ett typnamn inom parentes .
I sådana situationer kräver Java-kompilatorn att programmeraren anger typecast-operatören. I allmänhet ser det ut så här:
(type) expression
Exempel:
Koda | Beskrivning |
---|---|
|
Varje gång måste typcast-operatören anges uttryckligen |
Här a
är lika med 1
, och kanske verkar typecast-operatören som överdriven. Men tänk om de a
var större?
Koda | Beskrivning |
---|---|
|
|
En miljon passar perfekt in i en long
och en int
. Men när man tilldelar en miljon till en short
variabel, kasseras de två första byten, och endast de två sista byten behålls. Och när du tilldelar en byte
, är det enda som återstår den sista byten.
Hur siffrorna är ordnade i minnet:
Typ | Binär notation | Decimalnotation |
---|---|---|
int |
0b 00000000 00001111 01000010 01000000 | 1000000 |
short |
0b 01000010 01000000 | 16.960 |
byte |
0b 01000000 | 64 |
char
typ
A char
, som en short
, upptar två byte, men för att konvertera en till en annan behöver du alltid använda en typecast-operator. Problemet här är att short
typen är signerad och kan innehålla värden från -32,768
till +32,767
, men char
typen är osignerad och kan innehålla värden från 0
till 65,535
.
Negativa tal kan inte lagras i en char
, men de kan lagras i en short
. Och a short
kan inte lagra nummer större än 32,767
, men sådana nummer kan lagras i en char
.
4. Typ av uttryck
Vad händer om variabler av olika typer används i samma uttryck? Logiskt sett förstår vi att de först måste konverteras till en vanlig typ. Men vilken?
Till den större förstås.
Java konverterar alltid till den större typen. Grovt sett breddas först en av typen och först därefter utförs operationen med värden av samma typ.
Om an int
och a long
är inblandade i ett uttryck, kommer värdet av den int
att konverteras till a long
och först då fortsätter operationen:
Koda | Beskrivning |
---|---|
|
a kommer att breddas till a long och då kommer tillägget att ske. |
Flyttal
Om ett heltal och ett flyttal ( float
eller double
) är inblandade i ett uttryck, kommer heltal konverteras till ett flyttal ( float
eller double
), och först då kommer operationen att utföras.
Om operationen involverar a float
och a konverteras double
den till en . Vilket faktiskt förväntas.float
double
Typerna byte
, short
, och char
konverteras alltid till int
när de interagerar med varandra. Det finns en bra anledning till varför int
typen anses vara standard heltalstyp.
Om du multiplicerar a byte
med a short
får du en int
. Om du multiplicerar a byte
med a byte
får du en int
. Även om du lägger till a byte
och a byte
får du en int
.
Det finns flera anledningar till detta. Exempel:
Koda | Beskrivning |
---|---|
|
110 * 120 är 13,200 , vilket är något större än maxvärdet för byte typen:127 |
|
110 + 120 är 230 , vilket också är något större än maxvärdet för byte typen:127 |
I allmänhet, när vi multiplicerar ett 8-bitars (1 byte) tal med ett 8-bitars (1 byte) tal, får vi ett tal som upptar 16-bitars bitar (2 byte)
Som ett resultat konverteras alla operationer med heltalstyper som är mindre än int
alltid omedelbart till int
s. Och det betyder att om du vill lagra resultatet av beräkningen i en variabel av en typ som är mindre än en , int
måste du alltid explicit specificera typecast-operatorn.
Exempel:
Koda | Beskrivning |
---|---|
|
Uttrycket byte * byte blir enint |
|
Uttrycket byte + byte blir enint |
|
Uttrycket byte + int kommer att vara en int Den bokstavliga är en int . |
5. En viktig nyans
Typcast-operatören har ganska hög prioritet.
Det betyder att om ett uttryck innehåller till exempel addition och en typecast-operator, kommer typcasten att utföras före tillägget.
Exempel:
Koda | Beskrivning |
---|---|
|
Typecast-operatorn kommer endast att tillämpas på a variabeln, som redan är en byte . Den här koden kommer inte att kompileras. |
|
Detta är det korrekta sättet. |
Om du vill konvertera hela uttrycket till en specifik typ, och inte bara en komponent i uttrycket, linda in hela uttrycket inom parentes och sätt typcastoperatorn framför.
GO TO FULL VERSION