Java primitivne konverzije

1. Uvod

Java je tipizirani jezik što znači da koristi koncept tipova. Dvije su različite vrste tipova:

  1. primitivni tipovi podataka
  2. apstraktni tipovi podataka.

U ovom ćemo se članku usredotočiti na pretvorbe primitivnih tipova.

2. Pregled primitiva

Prvo što moramo znati je kakve se vrijednosti mogu koristiti s primitivnim tipovima. Postoji osam primitivnih tipova koji su:

  • bajt - 8 bita i potpisano

  • kratak - 16 bita i potpisano

  • ugljen - 16 bitova i nepotpisano, tako da može predstavljati Unicode znakove

  • int - 32 bita i potpisano

  • dugo - 64 bita i potpisano

  • plutati - 32 bita i potpisano

  • dvostruko - 64 bita i potpisano

  • boolean - nije numerički, možda samo ima pravi ili lažno vrijednosti

Ovo nije namijenjena opsežnoj raspravi o primitivnim osobama, a razgovarat ćemo malo više o njihovim pojedinostima po potrebi tijekom pretvorbe.

3. Širenje primitivnih konverzija

Kada moramo pretvoriti iz primitiva koji je jednostavniji ili manji od odredišnog tipa, za to ne moramo koristiti nikakve posebne oznake:

int myInt = 127; long myLong = myInt;

Tijekom proširenja pretvorbe, manja primitivna vrijednost stavlja se preko većeg spremnika, što znači da je sav dodatni prostor s lijeve strane vrijednosti ispunjen nulama. To se također može koristiti za prelazak iz cjelobrojne skupine u plutajuću točku:

float myFloat = mojDugi; udvostruči myDouble = myLong;

To je moguće jer prelaskom na širi primitiv ne gube se nikakve informacije.

4. Sužavanje primitivne konverzije

Ponekad trebamo uklopiti vrijednost veću od vrste koja se koristi u deklaraciji varijable. To može rezultirati gubitkom podataka jer će neke bajtove morati baciti.

U ovom slučaju moramo izričito izraziti da smo svjesni situacije i slažemo se s tim, koristeći glumačku postavu:

int myInt = (int) myDouble; bajt myByte = (bajt) myInt;

5. Širenje i sužavanje primitivne konverzije

Ova se situacija događa u vrlo specifičan slučaj kada želimo pretvoriti iz a bajt do a ugljen. Prva konverzija je proširenje bajt do int a zatim iz int sužen je na ugljen.

Primjer će pojasniti ovu točku:

bajt myLargeValueByte = (bajt) 130; // 0b10000010 -126

Binarni prikaz 130 jednak je za -126, razlika je u interpretaciji signalnog bita. Pretvorimo sada iz bajt do ugljen:

char myLargeValueChar = (char) myLargeValueByte; // 0b11111111 10000010 nepotpisana vrijednost int myLargeValueInt = myLargeValueChar; // 0b11111111 10000010 65410

The ugljen predstavljanje je Unicode vrijednost, ali pretvaranje u int pokazao nam je vrlo veliku vrijednost koja ima nižih 8 bitova potpuno jednake kao -126.

Ako ga ponovno pretvorimo u bajt dobivamo:

bajt myOtherByte = (bajt) myLargeValueInt; // 0b10000010 -126

Izvorna vrijednost koju smo koristili. Ako je cijeli kod počinjao s ugljen vrijednosti će biti različite:

char myLargeValueChar2 = 130; // Ovo je int a ne bajt! // 0b 00000000 10000010 nepotpisana vrijednost int myLargeValueInt2 = myLargeValueChar2; // 0b00000000 10000010 130 bajta myOtherByte2 = (bajt) myLargeValueInt2; // 0b10000010 -126

iako bajt zastupljenost je ista, što je -126, ugljen predstavljanje nam daje dva različita lika.

6. Konverzija boksa / raspakiranja

U Javi imamo klasu omotača za svaku primitivnu vrstu, ovo je pametan način da programerima pružimo korisne metode obrade, bez potrebe da sve imamo kao tešku referencu objekta. Od Jave 1.5 uključena je mogućnost automatskog pretvaranja u / iz primitiva u objekt i natrag, a to se postiže jednostavnim pripisivanjem:

Integer myIntegerReference = myInt; int myOtherInt = myIntegerReference;

7. String pretvorbe

Svi se primitivni tipovi mogu pretvoriti u Niz kroz njihove klase omota, koji nadjačavaju toString () metoda:

Niz myString = myIntegerReference.toString ();

Ako se trebamo vratiti na primitivni tip, trebamo upotrijebiti metodu raščlanjivanja definiranu odgovarajućom klasom Wrapper:

byte myNewByte = Byte.parseByte (myString); kratko myNewShort = Short.parseShort (myString); int myNewInt = Integer.parseInt (myString); long myNewLong = Long.parseLong (myString); float myNewFloat = Float.parseFloat (myString); double myNewDouble = Double.parseDouble (myString); 
boolean myNewBoolean = Boolean.parseBoolean (myString);

Jedina iznimka ovdje je Lik Razred jer a Niz napravljeno je od ugljenionako, na ovaj način, s obzirom na to da je vjerojatno Niz je napravljen od jednog ugljen, možemo koristiti charAt () metoda Niz razred:

char myNewChar = myString.charAt (0);

8. Numeričke promocije

Da bi se izvršila binarna operacija, potrebno je da su oba operanda kompatibilna u pogledu veličine.

Primjenjuje se niz jednostavnih pravila:

  1. Ako je jedan od operanda a dvostruko, drugi je unaprijeđen u dvostruko
  2. Inače, ako je jedan od operanda a plutati, drugi je unaprijeđen u plutati
  3. Inače, ako je jedan od operanda a dugo, drugi je unaprijeđen u dugo
  4. Inače se uzimaju u obzir oba int

Pogledajmo primjer:

bajt op1 = 4; bajt op2 = 5; bajt myResultingByte = (bajt) (op1 + op2);

Oba su operanda promovirana u int a rezultat se mora spustiti na bajt opet.

9. Zaključak

Pretvorba između vrsta vrlo je čest zadatak svakodnevnih programskih aktivnosti. Postoji niz pravila koja reguliraju načine na koje statički upisani jezici upravljaju tim pretvorbama. Poznavanje ovih pravila može uštedjeti puno vremena kada pokušavate shvatiti zašto se određeni kod kompilira ili ne.

Kôd korišten u ovom članku možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found