Típusú öntés

A Java az erőteljes gépeléssel rendelkező nyelvekre vonatkozik - ez azt jelenti, hogy a fordítási idő alatt a típusok kompatibilitási ellenőrzése szinte mindig megtörténik. A Java megakadályozza a helytelen hozzárendelést, megtiltva minden kétes műveletet, és támogatja az öntési mechanizmust olyan esetekben, amikor a kompatibilitás csak futásidő alatt ellenőrizhető. A hozzárendelési művelet példáján fogjuk tekintetbe venni, de mindez a kifejezéseken belüli konverziókra vonatkozik, és az értékek hozzárendelését az eljárás paramétereihez.

5.13.1. Implicit casting

Java is támogatja implicit öntés egy egész számot lebegőpontos típusok, de fordítva nem - egy ilyen átmenet nem történik alulcsordulás, mint a tartományban lebegőpontos értékek nagyobb, mint bármelyik egész szám típusok.

A tartomány megőrzését nem szabad összekeverni a pontosság megőrzésével. Bizonyos implicit konverziók esetén a pontosság elvesztése lehetséges. Például fontolja meg a hosszú lebegés konverzióját. Az úszó értékek 32 bites értékek, és a hosszú értékek -

64-bit. Az úszó kevésbé jelentős számjegyeket tartalmaz, mint a hosszú,

Ez a típus képes számokat tárolni egy nagyobb tartományban. Hosszú érték hozzárendelése

Egy változó típusú lebegő adatvesztéshez vezethet. Tekintsük a következő részletet:

hosszú orig = 0x7effffffffffffffL;

float fval = orig;

hosszú veszteség = (hosszú) fval;

System.out.println ("orig =" + orig); System.out.println ("fval =" + fval); System.out.println ("losw =" + elveszít);

Az első két operátor hosszú értéket hoz létre és hozzárendeli a változó úszóhoz. Annak igazolására, hogy ez a veszteség a pontosság, teszünk egy explicit öntött fval hosszú és hozzárendelt értéket egy másik változó (explicit típus alább). Az eredmények kiadási program lehetővé teszi, hogy megbizonyosodjon arról, hogy az érték float veszített a pontosság, mert az értéke az eredeti változót orig hosszú típus különbözik attól, amit már elő fordított működtetés kifejezett értéke a változó fval hosszú típusa:

orig = 9151314442816847871 fval = 9,15131e + 18

Null érték hozzárendelhető bármilyen típusú objektumhoz, beleértve a tömb referenciát is.

5.13.2. Explicit cast és instanceof

Ha egy típusú érték nem rendelhető hozzá egy másik típusú változóhoz implicit öntöttel, akkor gyakran használhatsz explicit öntött öntést. Az explicit csökkentés megkívánja, hogy az új típusú új érték a lehető legjobban illeszkedjen a régi típusú régi értékhez. Néhány explicit leadás nem megengedett (a logikai értéket nem lehet átvenni int-ba), de például egy dupla számot is megadhat egy hosszú típusú értékhez, amint az a következő részletekben látható:

Ha egy lebegőpontos értéket egész számra alakítanak át, a törtrészét elvetik; például (int) -72,3 egyenlő -72. A Math osztályban vannak olyan módszerek, amelyek egyébként lekerekítik a lebegőpontos számokat, amikor egész számra konvertálják - lásd a "Math class" részt.

A dupla értéket kifejezetten úszó típusúvá és az egész értékre is át lehet alakítani

típus - kisebb egész típushoz. Ha duplán lebegnek, akkor előfordulhat, hogy a korábban létező végpont helyett pontatlanságot, vagy nullát vagy végtelen értéket tapasztalnak.

Az egész típusok csökkentése az, hogy "vágják" magas rendű bitjeiket. Ha a nagyobb egész szám értéke egy kisebb típusba illeszkedik, amelyhez az átalakulás történik, akkor semmi sem szörnyű. Ha azonban a nagyobb egész szám a szűkebb típuson kívül esik, akkor a nagy rendű bitek elvesztése megváltoztatja az értéket és esetleg a jelet. részlet:

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

a következő eredményt adja ki (mivel az s nagybetűs bitjei elvesztek, amikor az érték b) -ben van tárolva:

char lehet átalakítani bármilyen egész számra és fordítva. Ha egész számot ír be charre, akkor csak az alsó 16 bitet használják, és a többi bitet elvetik. Ha char értéket egész számra konvertálunk, akkor a felső 16 bit tele van nullával. Mindazonáltal a későbbiekben ezekkel a bitekkel végzett munkák pontosan ugyanúgy zajlanak, mint bármely más. Az alább bemutatott programrészben a maximális Unicode karaktert int (implicit módon) és rövidre (explicit módon) konvertáljuk. Az int (0x0000ffff) értéke pozitív, mivel a karakter nagybetűs bitjei törlődnek. Ha azonban egy rövid típusba öntünk, negatív értéket kapunk, mivel a rövid típus legjelentősebb bitje az aláírt bit:

nyilvános statikus érvénytelen fő (String [] args)

int i = '\ uffff';

rövid s = (rövid) '\ uffff';

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

És itt a munka eredménye:

Az explicit öntvény objektumokhoz is alkalmazható. Bár egy kiterjesztett típusú objektum használható szuper típusú objektum helyett, a fordított rendszer általában nem igaz. Tegyük fel, hogy a következő objektum hierarchiája van:

De néha biztosan tudja biztosan, hogy a Coffee objektum valójában a Mocha osztály egy példánya. Ebben az esetben végrehajthatja az önkifejezés kifejezett csökkentését. Ez a következőképpen történik:

Mocha fancy = (Mocha) joe;

Néha egy módszer nem követeli meg, hogy egy objektum legyen kiterjesztett típus, de a fejlett objektumokhoz további funkciók is elérhetők. Kiválaszthat egy típust és feldolgozhat egy kivételt, de a kivételek hasonló célokra történő felhasználása viszonylag lassú, ezért rossz stílusnak tekinthető. Annak megállapításához, hogy egy objektum egy adott típusú, a method instanceof használják, amely az érvényes transzformációkhoz igaz értéket ad vissza:

public void quaff (kávé joe)

ha (joe instanceof Mocha)

// ... használja a Mocha funkcionalitását

null instanceof típus

minden típusú típushoz mindig hamis.

5.13.3. String cast

A String osztály eltér a többiektől: implicit módon használják a concatenation operátorban

+, és a string literálok a String objektumokra utalnak. Példák már előfordultak a programokban: a concatenáció végrehajtása során a Java megpróbálja átalakítani mindazt, ami nem tartozik ehhez a típushoz a String-hez. Hasonló casteket definiálunk minden primitív típushoz, és az objektum toString metódusának megadásával hajtjuk végre (lásd a "Method toString" fejezetet).

Ha a nullára hivatkozik a Stringre, az eredmény a "null" karakterlánc. Ha ehhez az osztályhoz a toString metódust nem definiáljuk, akkor az objektum osztályból örökölt metódust használunk és visszaadjuk az objektumtípus sztring ábrázolását.

Kapcsolódó cikkek