CodeGym /Java блог /Случаен /Класове обвивки в Java
John Squirrels
Ниво
San Francisco

Класове обвивки в Java

Публикувано в групата
здрасти Вече сте добре запознати с примитивните типове и сте работor доста с тях. В програмирането (и по-специално в Java) примитивите имат много предимства: те използват малко памет (и по този начин правят програмата по-ефективна) и имат ясно очертан диапазон от стойности. Въпреки това, докато учим Java, ние вече често повтаряме мантрата "всичко в Java е обект". Но примитивите директно противоречат на тези думи. Те не са обекти. И така, фалшив ли е нашият принцип „всичко е обект“? Всъщност не е. В Java всеки примитивен тип има брат близнак, клас обвивка.

Какво е Wrapper Class?

Обвивката е специален клас, който съхранява примитив вътрешно. Но тъй като това е клас, можете да създавате негови екземпляри. Те съхраняват примитивните стойности вътрешно, но все още са реални обекти. Имената на класове обвивки са много подобни (or точно същите като) имената на съответните им примитиви. Така че те са лесни за запомняне.
Класове обвивки за примитивни типове данни
Примитивни типове данни Класове обвивки
вътр Цяло число
къс Къс
дълго Дълги
byte Байт
плавам Поплавък
двойно Двойна
въглен Характер
булево Булева стойност
Wrapper обектите се създават по същия начин като всеки друг обект:

public static void main(String[] args) {

   Integer i = new Integer(682);
  
   Double d = new Double(2.33);
  
   Boolean b = new Boolean(false);
}
Класовете обвивки ни позволяват да смекчим недостатъците на примитивните типове. Най-очевидното е, че примитивите нямат методи. Например, те нямат метод toString() , така че не можете, например, да конвертирате int в String . Но обвиващият клас Integer прави това лесно.

public static void main(String[] args) {

   Integer i = new Integer(432);
  
   String s = i.toString();
}
Преобразуването в другата посока обаче може да бъде по-трудно. Да кажем, че имаме String , за който със сигурност знаем, че съдържа число. Независимо от това, няма естествен начин да се използва примитивен int за извличане на числото от низа и преобразуването му в число. Но можем с класовете обвивки.

public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Изход:
1166628
Успешно извлякохме число от низа и го присвоихме на референтната променлива Integer i . Между другото, относно препратките. Вече знаете, че аргументите се предават на методите по различни начини: примитиви по стойност и обекти по препратка. Можете да използвате тези знания, когато създавате свои собствени методи: например, ако вашият метод използва дробни числа, но имате нужда от логика за предаване по препратка, можете да подадете аргументи Double / Float към метода instead of double / float . В допълнение към методите на обвиващите класове, техните статични полета също могат да бъдат много удобни. Например, представете си, че имате следната задача: покажете възможно най-многоint стойност, последвана от минималната възможна стойност. Този проблем изглежда доста основен. Но без Google е малко вероятно да можете да го направите. Но обвивките ви позволяват лесно да се справяте с такива „обикновени задачи“:

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

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Тези полета ви предпазват от разсейване от изпълнението на по-сериозни задачи. Да не говорим за факта, че въвеждането на 2147483647 (което случайно е стойността на MAX_VALUE) не е нищожно постижение! :) Освен това в предишен урок посочихме, че обектите-обвивки са неизменни.

public static void main(String[] args) {

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

   b = a;
   a = 1;
   System.out.println(b);
}
Изход:
0
Състоянието на обекта, първоначално посочен от a , не се е променило (защото стойността на b също би се променила). Както при String s, instead of да се променя състоянието на обекта на обвивката, в паметта се създава изцяло нов обект. И така, защо създателите на Java в крайна сметка решиха да оставят примитивните типове в езика? Тъй като всичко трябва да бъде обект и имаме класове обвивки, които могат да изразят всичко, което изразяват примитивите, защо не само да запазим обвивките в езика и да премахнем примитивите? Отговорът е прост: производителност. Примитивните типове се наричат ​​примитивни, защото им липсват много от "тежките" характеристики на обектите. Да, обектите имат много удобни методи, но не винаги имате нужда от тях. Понякога всичко, от което се нуждаете, е числото 33, or 2,62, or true / false . В ситуации, в които предимствата на обектите нямат meaning и не са необходими за функционирането на програмата, примитивите са много по-подходящи за задачата.
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION