Turnarea de tip

Java se referă la limbile cu tastare puternică - aceasta înseamnă că, la momentul compilării, verificările de compatibilitate pentru tipuri sunt aproape întotdeauna efectuate. Java previne atribuirea incorectă, interzicerea tuturor oricăror tranzacții dubioase, și oferă un mecanism pentru a aduce acele tipuri de cazuri în care compatibilitatea pot fi verificate numai în timpul executării programului. Vom lua în considerare exemplul turnării unui operator de atribuire, dar acest lucru se aplică și transformări în interiorul expresii, și la atribuirea metode de parametri.







5.13.1. Implicarea turnării

Java suportă de asemenea implicit turnare un număr întreg de la tipuri de virgulă mobilă, dar nu și invers - într-o astfel de tranziție nu are loc îngroșatul ca intervalul de virgulă flotantă valori mai mari decât cea a oricare dintre tipurile întregi.

Conservarea gamei nu trebuie confundată cu menținerea acurateței. Cu unele conversii implicite, este posibilă o pierdere de precizie. De exemplu, luați în considerare conversia lungă în float. Valorile flotante sunt valori pe 32 de biți și valori lungi -

64-biți. Floatul conține cifre mai puțin semnificative decât lung, deși,

Acest tip este capabil să stocheze numere dintr-o gamă mai mare. Atribuirea unei valori lungi

O variabilă de tip float poate duce la pierderea datelor. Luați în considerare fragmentul următor:

lung orig = 0x7effffffffffffffL;

float fval = orig;

lungul pierde = (lung) fval;

System.out.println ("orig =" + orig); System.out.println ("fval =" + fval); System.out.println ("losw =" + pierde);

Primii doi operatori creează o valoare lungă și îi atribuie variabilei float. Pentru a demonstra că aceasta este o pierdere de precizie, vom face o fval exprimate explicit de lung și li se atribuie o valoare de o altă variabilă (de tip explicit este discutat mai jos). Programul de ieșire rezultate permite să se asigure că valoarea float a pierdut o parte din exactitatea lor, pentru că valoarea variabilei originale orig de tip lung, diferit de ceea ce a fost obținut prin acționarea inversă valoare explicită la variabila fval tip lung:

orig = 9151314442816847871 fval = 9.15131e + 18

O valoare nulă poate fi atribuită unei referințe la un obiect de orice tip, inclusiv o referință de matrice.

5.13.2. Exprimate exprimate și exampleof

În cazul în care valoarea unui tip nu poate fi atribuit unei variabile de un alt tip de implicite se poate folosi de tip explicit de multe ori (exprimate). Redactarea explicită necesită ca noua valoare a tipului nou să se potrivească cât mai bine cu vechea valoare a tipului vechi. Unele exprimate explicit nu este validă (nu se poate converti un Boolean int), dar este permis, de exemplu, o distribuție explicită a dubla valoarea tipului de lung, așa cum se arată în următorul fragment:







Atunci când o valoare în virgulă mobilă este convertită la un tip întreg, partea sa fracționată este aruncată; de exemplu, (int) -72.3 este egal cu -72. În clasa Math, există metode care altfel rotunjește numerele cu puncte în virgulă când se convertesc la un număr întreg - vedeți secțiunea "Clasa matematică".

Valoarea dublă poate fi, de asemenea, convertită explicit la un tip de tip float și valoarea întregă

tip - la un tip întreg mai mic. La turnarea dublă pentru a pluti, este posibil să existe o pierdere de precizie sau apariția unei valori zero sau infinite în loc de cea finală existentă anterior.

Reducerea tipurilor întregi este de "tăiere" a biților lor de înaltă calitate. Dacă valoarea întregului întreg se potrivește într-un tip mai mic, la care are loc transformarea, atunci nu se întâmplă nimic teribil. Cu toate acestea, dacă tipul întreg mai mare este în afara tipului mai restrâns, atunci pierderea biților de ordin înalt modifică valoarea și, eventual, semnul. fragment:

System.out.println ("s =" + s + ", b =" + b);

emite rezultatul următor (deoarece biții de ordin înalt ai lui s se pierd când valoarea este stocată în b):

char poate fi convertit în orice tip întreg și invers. Atunci când se distribuie un tip întreg în char, se utilizează numai cei 16 biți inferiori, iar biții rămași sunt eliminați. La transformarea unui caracter într-un tip întreg, primii 16 biți sunt umpluți cu zerouri. Cu toate acestea, lucrul mai târziu cu acești biți se realizează exact la fel ca și cu oricare altul. În fragmentul de program prezentat mai jos, caracterul maxim Unicode este convertit în int (implicit) și în scurt (explicit). Valoarea int (0x0000ffff) este pozitivă, deoarece biții de înaltă ordine ale caracterului sunt șterși. Cu toate acestea, atunci când este distribuit la un tip scurt, se obține o valoare negativă, deoarece bitul mare al tipului scurt este bitul semnat:

public static void principal (String [] args)

int i = '\ uffff';

scurt s = (scurt) '\ uffff';

System.out.println ("i =" + i); System.out.println ("s =" + s);

Iată rezultatul lucrării:

Turnarea explicită poate fi aplicată și obiectelor. Deși un obiect de tip extins este permis să fie folosit în locul unui obiect supertype, inversul nu este, în general, adevărat. Să presupunem că aveți următoarea ierarhie de obiecte:

Dar, uneori, știți absolut sigur că obiectul de cafea este de fapt o instanță a clasei Mocha. În acest caz, puteți implementa o coborâre explicită a distribuției. Acest lucru se face după cum urmează:

Mocha fantezie = (Mocha) joe;

Uneori, o metodă nu necesită ca un obiect să fie de tip extins, dar poate oferi obiecte avansate cu funcții suplimentare. Puteți face o excepție, dar utilizarea excepțiilor în scopuri similare este relativ lentă și, prin urmare, este considerată o manifestare a unui stil rău. Pentru a determina dacă un obiect este de un anumit tip, se folosește metoda instanceof, care returnează adevărat pentru transformările valide:

public void quaff (Coffee joe)

dacă (Joe exemplu de Mocha)

// ... utilizează funcționalitatea Mocha

null instanceof Type

este întotdeauna fals pentru orice tip de tip.

5.13.3. String distribuit

Clasa String diferă de celelalte: este implicit utilizată în operatorul de concatenare

+, și literali de șir se referă la obiecte String. Exemple au fost deja întâlnite în programe: atunci când execută concatenare, Java încearcă să convertească tot ce nu aparține acestui tip la String. Formele similare sunt definite pentru toate tipurile primitive și sunt efectuate prin apelarea metodei toString a obiectului (vezi secțiunea "Method toString").

Dacă convertiți o referință null la String, rezultatul este șirul "null". Dacă pentru această clasă nu este definită metoda toString, atunci se folosește o metodă moștenită din clasa Object și returnează o reprezentare de șir a tipului de obiect.







Articole similare

Trimiteți-le prietenilor: