CodeGym /Blog Java /Random-PL /Klasy opakowujące w Javie
Autor
Aditi Nawghare
Software Engineer at Siemens

Klasy opakowujące w Javie

Opublikowano w grupie Random-PL
Cześć! Jesteś już dobrze zaznajomiony z typami pierwotnymi i sporo z nimi pracowałeś. W programowaniu (a szczególnie w Javie) prymitywy mają wiele zalet: zużywają mało pamięci (a przez to sprawiają, że program jest wydajniejszy) i mają jasno określony zakres wartości. Jednak ucząc się Javy często już powtarzaliśmy mantrę „wszystko w Javie jest obiektem”. Ale prymitywy bezpośrednio zaprzeczają tym słowom. To nie są przedmioty. Czy zatem nasza zasada „wszystko jest przedmiotem” jest fałszywa? Właściwie to nie. W Javie każdy prymitywny typ ma brata bliźniaka, klasę opakowującą.

Co to jest klasa opakowania?

Opakowanie to specjalna klasa, która przechowuje wewnętrznie prymityw. Ale ponieważ jest to klasa, możesz tworzyć jej instancje. Przechowują prymitywne wartości wewnętrznie, ale nadal są obiektami rzeczywistymi. Nazwy klas opakowujących są bardzo podobne (lub dokładnie takie same) jak nazwy odpowiadających im prymitywów. Są więc łatwe do zapamiętania.
Klasy opakowania dla pierwotnych typów danych
Pierwotne typy danych Klasy opakowania
int Liczba całkowita
krótki Krótki
długi Długi
bajt Bajt
platforma Platforma
podwójnie Podwójnie
zwęglać Postać
logiczna logiczne
Obiekty opakowujące są tworzone w taki sam sposób, jak każdy inny obiekt:

public static void main(String[] args) {

   Integer i = new Integer(682);
  
   Double d = new Double(2.33);
  
   Boolean b = new Boolean(false);
}
Klasy opakowujące pozwalają nam złagodzić wady typów pierwotnych. Najbardziej oczywiste jest to, że prymitywy nie mają metod. Na przykład nie mają metody toString() , więc nie można na przykład przekonwertować int na String . Ale klasa opakowująca Integer ułatwia to zadanie.

public static void main(String[] args) {

   Integer i = new Integer(432);
  
   String s = i.toString();
}
Jednak konwersja w innym kierunku może być trudniejsza. Powiedzmy, że mamy String , o którym wiemy na pewno, że zawiera liczbę. Niezależnie od tego nie ma natywnego sposobu użycia prymitywnej liczby całkowitej do wyodrębnienia liczby z łańcucha i przekonwertowania jej na liczbę. Ale możemy z klasami opakowującymi.

public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Wyjście:
1166628
Udało nam się wyodrębnić liczbę z łańcucha i przypisać ją do zmiennej referencyjnej typu Integer i . Przy okazji, jeśli chodzi o referencje. Wiesz już, że argumenty są przekazywane do metod na różne sposoby: prymitywy przez wartość i obiekty przez referencje. Możesz wykorzystać tę wiedzę podczas tworzenia własnych metod: na przykład, jeśli twoja metoda używa liczb ułamkowych, ale potrzebujesz logiki do przekazywania przez referencję, możesz przekazać metodzie argumenty Double / Float zamiast double / float . Oprócz metod klas opakowujących, bardzo wygodne mogą być również ich pola statyczne. Na przykład wyobraź sobie, że masz następujące zadanie: wyświetlić maksimum możliweint wartość, po której następuje minimalna możliwa wartość. Ten problem wydaje się dość podstawowy. Ale bez Google jest mało prawdopodobne, że możesz to zrobić. Ale opakowania pozwalają łatwo obsłużyć takie „prozaiczne zadania”:

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

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Te pola chronią Cię przed odwróceniem uwagi od wykonywania poważniejszych zadań. Nie wspominając już o tym, że wpisanie 2147483647 (które jest wartością MAX_VALUE) to nie lada wyczyn! :) Ponadto w poprzedniej lekcji wskazaliśmy, że obiekty opakowujące są niezmienne.

public static void main(String[] args) {

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

   b = a;
   a = 1;
   System.out.println(b);
}
Wyjście:
0
Stan obiektu pierwotnie wskazywanego przez a nie zmienił się (ponieważ wartość b również by się zmieniła). Podobnie jak w przypadku String s, zamiast zmieniać stan obiektu opakowującego, w pamięci tworzony jest zupełnie nowy obiekt. Dlaczego więc twórcy Javy ostatecznie postanowili pozostawić prymitywne typy w języku? Ponieważ wszystko powinno być obiektem, a mamy klasy opakowujące, które mogą wyrażać wszystko, co wyrażają prymitywy, dlaczego nie tylko zachować opakowywania w języku i usunąć prymitywy? Odpowiedź jest prosta: wydajność. Typy prymitywne nazywane są prymitywnymi, ponieważ brakuje im wielu „ciężkich” cech obiektów. Tak, obiekty mają wiele wygodnych metod, ale nie zawsze ich potrzebujesz. Czasami wszystko, czego potrzebujesz, to liczba 33 lub 2,62 lub prawda / fałsz . W sytuacjach, gdy zalety obiektów nie mają znaczenia i nie są wymagane do działania programu, prymitywy znacznie lepiej nadają się do tego zadania.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION