CodeGym /Java blog /Véletlen /Wrapper osztályok Java nyelven
John Squirrels
Szint
San Francisco

Wrapper osztályok Java nyelven

Megjelent a csoportban
Szia! Ön már jól ismeri a primitív típusokat, és elég sokat dolgozott velük. A programozásban (és különösen a Java-ban) a primitíveknek számos előnyük van: kevés memóriát használnak (és ezáltal hatékonyabbá teszik a programot), és világosan körülhatárolható értéktartományuk van. A Java tanulása közben azonban már gyakran ismételtük a „Java-ban minden egy objektum” mantrát. De a primitívek egyenesen ellentmondanak ezeknek a szavaknak. Nem tárgyak. Tehát hamis a "minden tárgy" elvünk? Valójában nem. A Java nyelven minden primitív típusnak van egy ikertestvére, egy wrapper osztály.

Mi az a wrapper osztály?

A wrapper egy speciális osztály, amely belül tárol egy primitívet. De mivel ez egy osztály, létrehozhat belőle példányokat. Belsőleg tárolják a primitív értékeket, de még mindig valódi objektumok. A wrapper osztályok nevei nagyon hasonlítanak (vagy pontosan megegyeznek) a hozzájuk tartozó primitívek nevével. Tehát könnyű megjegyezni őket.
Burkolati osztályok primitív adattípusokhoz
Primitív adattípusok Csomagoló osztályok
int Egész szám
rövid Rövid
hosszú Hosszú
byte Byte
úszó Úszó
kettős Kettős
char karakter
logikai érték Boolean
A burkoló objektumok ugyanúgy jönnek létre, mint bármely más objektum:

public static void main(String[] args) {

   Integer i = new Integer(682);
  
   Double d = new Double(2.33);
  
   Boolean b = new Boolean(false);
}
A wrapper osztályok segítségével enyhíthetjük a primitív típusok hiányosságait. A legnyilvánvalóbb az, hogy a primitíveknek nincsenek módszereik. Például nincs bennük toString() metódus, így például egy int nem konvertálható Stringgé . De az Integer wrapper osztály ezt megkönnyíti.

public static void main(String[] args) {

   Integer i = new Integer(432);
  
   String s = i.toString();
}
A másik irányú átalakítás azonban bonyolultabb lehet. Tegyük fel, hogy van egy karakterláncunk , amelyről biztosan tudjuk, hogy számot tartalmaz. Ettől függetlenül nincs natív módja annak, hogy egy primitív int segítségével kinyerjük a számot a karakterláncból , és számmá alakítsuk. De a wrapper osztályokkal megtehetjük.

public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Kimenet:
1166628
Sikeresen kinyertünk egy számot a Stringből , és hozzárendeltük az i Integer referenciaváltozóhoz . Egyébként a referenciákkal kapcsolatban. Már tudja, hogy az argumentumokat különböző módokon adják át a metódusoknak: primitívek érték szerint, objektumok pedig hivatkozással. Ezt a tudást felhasználhatja saját metódusainak létrehozásakor: például ha a metódus törtszámokat használ, de logikára van szüksége a hivatkozással történő átadáshoz, akkor a double / float helyett Double / Float argumentumokat adhat át a metódusnak . A burkoló osztályok metódusai mellett a statikus mezőik is nagyon kényelmesek lehetnek. Képzelje el például, hogy a következő feladata van: jelenítse meg a lehetséges maximumotint értéket, majd a lehető legkisebb értéket. Ez a probléma meglehetősen alapvetőnek tűnik. De a Google nélkül nem valószínű, hogy meg tudná csinálni. De a wrapperek lehetővé teszik az ilyen "hétköznapi feladatok" egyszerű kezelését:

public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Ezek a területek megakadályozzák, hogy elterelje a figyelmét a komolyabb feladatok elvégzésétől. Arról nem is beszélve, hogy a 2147483647 beírása (amely történetesen MAX_VALUE értéke) nem kis teljesítmény! :) Sőt, egy előző leckében rámutattunk, hogy a wrapper objektumok megváltoztathatatlanok.

public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
Kimenet:
0
Az eredetileg a által mutatott objektum állapota nem változott (mert b értéke is megváltozott volna). Az s karakterlánchoz hasonlóan a burkoló objektum állapotának megváltoztatása helyett egy teljesen új objektum jön létre a memóriában. Tehát miért döntöttek úgy a Java alkotói, hogy a primitív típusokat hagyják a nyelvben? Mivel mindennek objektumnak kell lennie, és vannak burkoló osztályaink, amelyek mindent kifejezhetnek, amit a primitívek kifejeznek, miért nem csak a burkolókat tartjuk a nyelvben, és eltávolítjuk a primitíveket? A válasz egyszerű: teljesítmény. A primitív típusokat primitívnek nevezzük, mert hiányzik belőlük az objektumok sok „nehézsúlyú” jellemzője. Igen, az objektumok számos kényelmes módszerrel rendelkeznek, de nincs mindig szükség rájuk. Néha csak a 33-as vagy a 2,62-es vagy az igaz / hamis számra van szüksége . Olyan helyzetekben, amikor az objektumok előnyei nem számítanak, és nem szükségesek a program működéséhez, a primitívek sokkal jobban megfelelnek a feladatnak.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION