JavaRush /Blog Jawa /Random-JV /Casting (konversi) jinis primitif ing Jawa

Casting (konversi) jinis primitif ing Jawa

Diterbitake ing grup
Hello! Nalika ngliwati JavaRush, sampeyan nemokake jinis primitif luwih saka sepisan. Mangkene dhaptar ringkes babagan apa sing kita ngerti babagan dheweke:
  1. Padha ora obyek lan makili nilai sing disimpen ing memori
  2. Ana sawetara jinis jinis primitif:
    • Nomer wutuh - byte, short, int,long
    • Nomer titik ngambang (fractional) - floatlandouble
    • Boolean -boolean
    • Simbolik (kanggo nunjukake huruf lan angka) -char
  3. Saben wong duwe sawetara nilai dhewe:
Tipe primitif Ukuran ing memori Range saka nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit kanggo -32768 kanggo 32767
char 16 bit saka 0 kanggo 65536
int 32 bit saka -2147483648 kanggo 2147483647
dawa 64 bit saka -9223372036854775808 nganti 9223372036854775807
ngambang 32 bit saka (2 kanggo daya -149) kanggo ((2-2 kanggo daya -23)*2 kanggo daya 127)
pindho 64 bit saka (-2 kanggo daya 63) kanggo ((2 kanggo daya saka 63) - 1)
boolean 8 (yen digunakake ing array), 32 (yen digunakake ing non-array) bener utawa salah
Nanging, saliyane kanggo nilai, jinis uga beda-beda ing ukuran memori. intnjupuk luwih saka byte. A long- luwih saka short. Jumlah memori sing dikuwasani dening primitif bisa dibandhingake karo boneka nesting: Ekspansi lan kontraksi jinis primitif - 2 Ana ruang bebas ing jero boneka nesting. Sing luwih gedhe boneka nesting, luwih akeh papan. longKita bisa kanthi gampang nyelehake sing luwih cilik ing njero boneka nesting gedhe int. Iku gampang pas lan sampeyan ora perlu nindakake apa-apa ekstra. Ing Jawa, nalika nggarap primitif, iki diarani konversi otomatis. Kanthi cara liya diarani extension. Punika conto ekstensi prasaja:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
Ing kene kita nemtokake nilai bytekanggo variabel int. Tugas kasebut sukses lan tanpa masalah: nilai sing disimpen ing byteruang memori kurang saka "cocog" ing int. "Boneka nesting cilik" (nilai byte) gampang pas karo "matryoshka gedhe" (variabel int). Masalah liyane nalika sampeyan nyoba ngelawan - lebokake nilai gedhe menyang variabel sing ora dirancang kanggo ukuran kasebut. Ing asas, trik iki ora bakal bisa digunakake karo boneka nesting nyata, nanging ing Jawa bakal bisa, nanging karo nuansa. Ayo nyoba nglebokake nilai intmenyang variabel short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
Kesalahan! Compiler mangertos sing nyoba kanggo nindakake soko non-standar, lan sijine boneka matryoshka gedhe ( int) nang cilik ( short). Kesalahan kompilasi ing kasus iki minangka peringatan saka kompiler: " Hei, sampeyan yakin pengin nindakake iki? "Yen sampeyan yakin, kandhani kompilator babagan iki:" Kabeh ora apa-apa, aku ngerti apa sing ditindakake!" ” Proses iki diarani konversi jinis eksplisit, utawa narrowing . Kanggo nggawe penyempitan, sampeyan kudu kanthi tegas nunjukake jinis sing sampeyan pengin menehi nilai. Kanthi tembung liya, wangsulana pitakon kompiler: " Lha, boneka cilik iki sing endi sing pengin dilebokake boneka gedhe iki?" "Ing kasus kita bakal katon kaya iki:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
Kita kanthi tegas nuduhake yen kita pengin nyetel nilai kasebut intdadi variabel shortlan tanggung jawab. Compiler, ndeleng indikasi eksplisit saka jinis sempit, nindakake konversi. Apa asile? Output konsol: -27008 A dicokot ora dikarepke. Kenapa persis kaya iki? Iku bener prasaja. Kita duwe nilai asli - 10000000 Iki disimpen ing variabel intsing njupuk 32 bit, lan ing bentuk binar katon kaya iki: Ekspansi lan kontraksi jinis primitif - 3 Kita nulis nilai iki menyang variabel short, nanging mung bisa nyimpen 16 bit! Mulane, mung 16 bit pisanan saka nomer kita bakal dipindhah ana, liyane bakal dibuwang. Akibaté, variabel shortbakal ngemot nilai Ekspansi lan kontraksi jinis primitif - 4, sing ing wangun desimal persis padha karo -27008 Mulane compiler "takon konfirmasi" ing wangun cast eksplisit kanggo jinis tartamtu. Sepisanan, iku nuduhake yen sampeyan njupuk tanggung jawab kanggo asil, lan sareh, iku ngandhani compiler carane akeh papan kanggo nyedhiakke nalika casting jinis. Sawise kabeh, yen ing conto pungkasan kita wis cast intkanggo ngetik byte, lan ora kanggo short, kita bakal duwe mung 8 bit ing pembuangan kita, ora 16, lan asil bakal wis beda. Kanggo jinis pecahan ( floatlan double), narrowing dumadi beda. Yen sampeyan nyoba ngowahi angka kasebut dadi jinis integer, bagean pecahan kasebut bakal dibuwang.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
Output konsol: 2

Tipe data char

Sampeyan wis ngerti yen jinis char digunakake kanggo nampilake karakter individu.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
Nanging nduweni sawetara fitur sing penting kanggo ngerti. Ayo katon maneh ing tabel kanthi rentang nilai:
Tipe primitif Ukuran ing memori Range saka nilai
bait 8 bit -128 kanggo 127
cendhak 16 bit -32768 kanggo 32767
char 16 bit saka 0 kanggo 65536
int 32 bit saka -2147483648 kanggo 2147483647
dawa 64 bit saka -9223372036854775808 nganti 9223372036854775807
ngambang 32 bit saka (2 kanggo daya -149) kanggo ((2-2 kanggo daya -23)*2 kanggo daya 127)
pindho 64 bit saka (-2 kanggo daya 63) kanggo ((2 kanggo daya saka 63)-1)
boolean 8 (yen digunakake ing array), 32 (yen digunakake ing non-array) bener utawa salah
Jinis kasebut charduwe sawetara angka saka 0 nganti 65536. Nanging apa tegese iki? Sawise kabeh, chariki ora mung angka, nanging uga huruf, tandha wacan ... Kasunyatane yen nilai chardisimpen ing Jawa ing format Unicode. Kita wis nemoni Unicode ing salah sawijining kuliah sadurunge. Sampeyan bisa uga eling yen Unicode minangka standar enkoding karakter sing kalebu karakter saka meh kabeh basa sing ditulis ing donya. Ing tembung liya, iki minangka dhaptar kode khusus sing ana kode kanggo meh kabeh karakter saka basa apa wae. Tabel Unicode umum gedhe banget lan, mesthi, ora perlu sinau kanthi ati-ati. Kene, contone, Piece saka iku: Wangsulan: Ekspansi lan kontraksi jinis primitif - 5 Bab ingkang utama punika mangertos prinsip nyimpen nilai char, lan elinga yen ngerti kode saka simbol tartamtu, sampeyan bisa tansah njaluk iku ing program. Coba iki kanthi nomer acak:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
Output konsol: 耰 Iki format sing karakter disimpen ing Jawa char. Saben karakter cocog karo nomer - kode angka 16 bit, utawa rong bita. Unicode 32816 cocog karo karakter 耰. Pay manungsa waé kanggo wayahe iki. Ing conto iki, kita nggunakake variabel int. Iku ngenggoni 32 bit memori , nalika char16 . Ing kene kita milih amarga nomer sing kita butuhake, 32816, ora ana ing kisaran . Senajan ukuran , kaya cendhak, 16 bit, ora ana nomer negatif ing sawetara, supaya "positif" sawetara kaping pindho minangka gedhe (65536 tinimbang 32767 ). Kita bisa nggunakake , anggere kode kita ana ing kisaran 65536. Nanging yen kita nggawe nomer , bakal njupuk luwih saka 16 bit. Lan nalika narrowing mudhun jinis: intshortcharcharcharshortintint >65536
char c = (char) x;
bit ekstra bakal dibuwak, lan asil bakal cukup ora dikarepke.

Fitur tambahan saka char lan integer

Ayo ndeleng conto sing ora biasa iki:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
Output konsol: 50 O_O Endi logika? 1 + 1, saka ngendi 50 teka?! Sampeyan wis ngerti yen nilai chardisimpen ing memori minangka angka ing kisaran saka 0 nganti 65536, sing makili Unicode karakter kita. Ekspansi lan kontraksi jinis primitif - 6 Dadi ing kene. Nalika kita nindakake tambahan charlan sawetara jinis integer chardiowahi menyang nomer sing cocog karo ing Unicode. Nalika ing kode kita ditambahake 1 lan '1', simbol '1' diowahi dadi kode, yaiku 49 (sampeyan bisa mriksa ing tabel ing ndhuwur). Mulane, asil dadi padha karo 50. Ayo maneh njupuk kanca lawas -minangka conto , lan nyoba kanggo nambah karo sawetara nomer.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
Output konsol: 33016 Kita wis ngerteni manawacocog karo kode 32816. Lan nalika kita nambah nomer iki lan 200, kita entuk persis asil - 33016 :) Mekanisme operasi, kaya sing sampeyan ngerteni, cukup prasaja.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION