1. Typecasting

Typecasting ing Jawa

Variabel saka jinis primitif (kajaba jinis boolean) digunakake kanggo nyimpen macem-macem jinis nomer. Sanajan jinis variabel ora tau diganti, ana papan sing bisa diowahi saka siji jinis menyang liyane. Lan papan kasebut minangka tugas .

Variabel saka macem-macem jinis bisa diutus kanggo saben liyane. Yen sampeyan nindakake iki, nilai variabel saka siji jinis diowahi dadi nilai jinis liyane lan ditugasake menyang variabel liya. Ing babagan iki, kita bisa ngenali rong jinis konversi jinis: widening lan narrowing.

Widening kaya kanggo mindhah nilai saka basket cilik menyang gedhe: operasi iki lancar lan ora krasa lara. Narrowing mengkono nalika sampeyan mindhah Nilai saka basket gedhe kanggo cilik: ana uga ora cukup papan, lan sampeyan kudu uncalan soko adoh.

Ing ngisor iki jinis-jinis, diurut miturut ukuran basket:

Aksara Jawa 2


2. Widening jinis konversi

Asring perlu kanggo nemtokake variabel saka siji jinis numerik menyang variabel saka jinis numerik liyane. Kepiye carane nindakake?

Jawa nduweni 4 jinis integer:

Jinis Ukuran
byte 1 byte
short 2 bytes
int 4 bytes
long 8 bytes

Variabel sing disimpen ing kranjang cilik bisa tansah ditugasake kanggo variabel sing disimpen ing kranjang sing luwih gedhe.

int, shortlan bytevariabel bisa gampang ditugasake menyang longvariabel. shortlan bytevariabel bisa ditugasake kanggo intvariabel. Lan bytevariabel bisa ditugasake kanggo shortvariabel.

Tuladha:

Kode Katrangan
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
Kode iki bakal dikompilasi kanthi apik.

Konversi kasebut, saka jinis sing luwih cilik dadi luwih gedhe, diarani konversi jinis widening .

Kepiye babagan nomer nyata?

Karo wong-wong mau, kabeh padha - ukuran penting:

Jinis Ukuran
float 4 bytes
double 8 bytes

floatvariabel bisa diutus kanggo doublevariabel tanpa masalah. Nanging iku luwih menarik karo jinis integer.

Sampeyan bisa nemtokake variabel integer menyang floatvariabel. Malah longjinis, sing dawane 8 bita. Lan sampeyan bisa nemtokake apa wae sing dikarepake - variabel utawa floatvariabel integer - menyang doublevariabel:

Kode Cathetan
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

Elinga yen ngonversi menyang jinis nyata bisa nyebabake mundhut presisi amarga ora cukup digit signifikan.

Nalika ngowahi saka integer menyang angka floating-point, bagean urutan ngisor nomer bisa dibuwak. Nanging amarga nomer pecahan dimangerteni kanggo nyimpen nilai kira-kira, operasi assignment kuwi diijini.


3. Narrowing jinis konversi

Apa babagan kemungkinan liyane? Apa yen sampeyan kudu nemtokake longnilai menyang intvariabel?

Mbayangno variabel minangka basket. Kita duwe bakul saka macem-macem ukuran: 1, 2, 4 lan 8 bita. Ora masalah nransfer apel saka bakul cilik menyang sing luwih gedhe. Nanging nalika pindhah saka kranjang sing luwih gedhe menyang sing luwih cilik, sawetara apel bisa ilang.

Transformasi iki — saka jinis sing luwih gedhe dadi jinis sing luwih cilik — diarani konversi jinis sing sempit . Nalika nindakake operasi tugas kaya iki, bagean saka nomer bisa uga ora cocog karo variabel anyar lan mulane bisa dibuwang.

Nalika narrowing jinis, kita kudu tegas marang compiler sing kita ora nggawe kesalahan, sing kita sengaja discarding bagéan saka nomer. Operator typecast digunakake kanggo iki. Iki minangka jeneng jinis ing kurung .

Ing kahanan kaya mengkono, compiler Java mbutuhake programmer kanggo nemtokake operator typecast. Umumé, katon kaya iki:

(type) expression

Tuladha:

Kode Katrangan
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
Saben operator typecast kudu dituduhake kanthi jelas

Punika awitjaksono kanggo 1, lan mbok menawa operator typecast katon kaya overkill. Nanging kepiye yen aluwih gedhe?

Kode Katrangan
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

Siji yuta mathuk sampurna menyang longlan menyang int. Nanging nalika nemtokake siji yuta kanggo shortvariabel, rong bait pisanan dibuwang, lan mung rong bait pungkasan sing disimpen. Lan nalika nemtokake kanggo a byte, mung bab sing tetep byte pungkasan.

Carane nomer disusun ing memori:

Jinis Notasi binar Notasi desimal
int 0b 00000000 00001111 01000010 01000000 1000000
short 0b 01000010 01000000 16.960
byte 0b 01000000 64

charjinis

A char, kaya a short, manggoni rong bita, nanging kanggo ngowahi siji liyane, sampeyan kudu tansah nggunakake operator typecast. Masalah ing kene yaiku shortjinis kasebut ditandatangani lan bisa ngemot nilai saka -32,768menyang +32,767, nanging charjinis kasebut ora ditandatangani lan bisa ngemot nilai saka 0nganti 65,535.

Nomer negatif ora bisa disimpen ing char, nanging bisa disimpen ing short. Lan shortora bisa nyimpen nomer luwih gedhe tinimbang 32,767, nanging nomer kuwi bisa disimpen ing char.


4. Jinis ekspresi

Apa yen variabel saka macem-macem jinis digunakake ing ekspresi sing padha? Secara logis, kita ngerti manawa dheweke kudu diowahi dadi jinis umum. Nanging sing endi?

Kanggo sing luwih gedhe, mesthi.

Jawa tansah diowahi dadi jinis kang luwih gedhe. Kira-kira, salah siji saka jinis pisanan widened lan mung banjur operasi dileksanakake nggunakake nilai saka jinis padha.

Yen an intlan a longmelu ekspresi, nilai kasebut intbakal diowahi dadi a longlan mung banjur operasi bakal diterusake:

Kode Katrangan
int a = 1;
long b = 2;
long c = a + b;
abakal widened kanggo a longbanjur tambahan bakal kelakon.

Angka floating-point

Yen integer lan nomer floating-point ( floatutawa double) melu ekspresi, integer bakal diowahi dadi angka floating-point ( floatutawa double), lan mung banjur operasi bakal dileksanakake.

Yen operasi kasebut kalebu a floatlan a double, banjur floatbakal diowahi dadi a double. Kang bener samesthine.

Kaget

The byte, short, lan charjinis tansah diowahi kanggo intnalika sesambungan karo saben liyane. Ana alesan sing apik kenapa intjinis kasebut dianggep minangka jinis integer standar.

Yen sampeyan multiply a bytedening a short, sampeyan bakal entuk int. Yen sampeyan multiply a bytedening a byte, sampeyan bakal entuk int. Sanajan sampeyan nambahake a bytelan byte, sampeyan bakal entuk int.

Ana sawetara alasan kanggo iki. Tuladha:

Kode Katrangan
byte a = 110;
byte b = 120;
byte c = a * b;  // Error
110 * 120yaiku 13,200, sing rada luwih gedhe tinimbang nilai maksimum jinis kasebut byte:127
byte a = 110;
byte b = 120;
byte c = a + b; // Error
110 + 120punika 230, kang uga rada luwih saka nilai maksimum jinis byte:127

Umumé, nalika nikelaké nomer 8-bit (1 bait) karo nomer 8-bit (1 bait), kita entuk nomer sing manggoni 16-bit bit (2 bait).

Akibaté, kabeh operasi karo jinis integer sing luwih cilik saka inttansah langsung diowahi kanggo ints. Lan tegese yen sampeyan pengin nyimpen asil pitungan ing variabel jinis sing luwih cilik tinimbang int, mula sampeyan kudu nemtokake operator typecast kanthi tegas.

Tuladha:

Kode Katrangan
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
Ekspresi kasebut byte * bytebakal dadiint
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
Ekspresi kasebut byte + bytebakal dadiint
byte a = 1;
byte b = (byte) (a + 1);
Ungkapan kasebut byte + intbakal dadi int
tembung sing harfiah yaiku int.

5. Nuansa penting

Operator typecast nduweni prioritas sing cukup dhuwur.

Tegese yen ekspresi ngemot, contone, tambahan lan operator typecast, typecast bakal dileksanakake sadurunge tambahan.

Tuladha:

Kode Katrangan
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
Operator typecast mung bakal ditrapake kanggo avariabel, sing wis dadi byte. Kode iki ora bakal kompilasi.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
Iki cara sing bener.

Yen sampeyan pengin ngowahi kabeh ekspresi menyang jinis tartamtu, lan ora mung siji komponen saka ekspresi, banjur bungkus kabeh ekspresi ing kurung lan sijine operator typecast ing ngarep.