JavaRush /Java Blogu /Random-AZ /Qablaşdırma, qablaşdırma və qablaşdırma

Qablaşdırma, qablaşdırma və qablaşdırma

Qrupda dərc edilmişdir
Salam! Siz artıq primitiv tiplərlə kifayət qədər tanışsınız və onlarla çox işləmisiniz. Qablaşdırma, qablaşdırma və qablaşdırma - 1Proqramlaşdırmada və xüsusən də Java-da primitivlərin bir çox üstünlükləri var: onlar az yaddaş tutur, bununla da proqramın səmərəliliyini artırır və açıq şəkildə dəyər diapazonlarına bölünür. Bununla belə, Java öyrənmə prosesində biz bir dəfədən çox təkrar etdik, məsələn, “ Javada hər şey bir obyektdir ” mantrası kimi. Amma primitivlər bu sözlərin birbaşa təkzibidir. Onlar obyekt deyillər. Yəni “hər şey obyektdir” prinsipi yanlışdır? Həqiqətən yox. Java-da hər ibtidai növün əkiz qardaşı, sarğı sinfi ( Wrapper) var. Sarğı nədir? Sarmalayıcı, primitivin dəyərini özündə saxlayan xüsusi sinifdir. Lakin bu bir sinif olduğu üçün öz nümunələrini yarada bilər. Həqiqi obyektlər olmaqla, lazımi primitiv dəyərləri içəridə saxlayacaqlar. Sarma siniflərinin adları müvafiq primitivlərin adlarına çox bənzəyir və ya onlarla tamamilə üst-üstə düşür. Buna görə də onları xatırlamaq çox asan olacaq.
İbtidai Məlumat Növləri üçün Sarmalayıcı Siniflər
Primitiv məlumat növləri Qaplama sinifləri
int Tam
qısa Qısa
uzun Uzun
bayt bayt
sal Sal
ikiqat İkiqat
char Xarakter
boolean Boolean
Sarmalayıcı sinif obyektləri hər hansı digər kimi yaradılır:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Sarma sinifləri primitiv növlərin çatışmazlıqlarını azaltmağa imkan verir. Ən bariz olanı odur ki, primitivlərin üsulları yoxdur . Məsələn, onların metodu yoxdur , ona görə də siz, məsələn, rəqəmi sətirə toString()çevirə bilməzsiniz . intAncaq sarğı sinfi ilə Integerbu asandır.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Ters çevrilmə ilə də çətinliklər olacaq. Deyək ki, bir sıra ehtiva etdiyinə əmin olduğumuz bir sətirimiz var. Lakin primitiv tipdə intbiz bu rəqəmi sətirdən əldə edib, əslində, ədədə çevirə bilməyəcəyik. Amma sarğı dərsləri sayəsində indi bu fürsətimiz var.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Nəticə: 1166628 Biz sətirdən nömrəni uğurla əldə etdik və onu istinad dəyişəninə təyin etdik Integer i. Yeri gəlmişkən, bağlantılar haqqında. Siz artıq bilirsiniz ki, parametrlər metodlara müxtəlif yollarla ötürülür: primitivlər dəyərlə, obyektlər isə istinadla ötürülür. Metodlarınızı yaradarkən bu biliklərdən istifadə edə bilərsiniz: əgər metodunuz, məsələn, kəsr ədədləri ilə işləyirsə, lakin istinadla ötürmə məntiqinə ehtiyacınız varsa, parametrləri metoda ötürə Double/Floatbilərsiniz double/float. Bundan əlavə, üsullara əlavə olaraq, sarğı sinifləri istifadə üçün çox rahat olan statik sahələrə malikdir. Məsələn, indi bir vəzifə ilə qarşılaşdığınızı təsəvvür edin: konsola mümkün olan maksimum rəqəmi int, sonra isə minimum mümkün nömrəni çap edin. Tapşırıq ibtidai görünür, amma yenə də Google olmadan bunu edə bilməyəcəksiniz. Və sarğı sinifləri asanlıqla aşağıdakı "gündəlik problemləri" həll etməyə imkan verir:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Belə sahələr daha ciddi işlərdən yayınmamağa imkan verir. Onu da qeyd edək ki, 2147483647 nömrəsinin çapı zamanı (bu, tam olaraq MAX_VALUE) onu səhv yazmaq təəccüblü deyil :) Bundan əlavə, əvvəlki mühazirələrdən birində biz artıq diqqəti cəlb etmişdik ki, sarğı siniflərinin obyektləri. dəyişməzdirlər .
public static void main(String[] args) {

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

   b = a;
   a = 1;
   System.out.println(b);
}
Çıxış: 0 İstinadın ilkin olaraq işarə etdiyi obyekt аöz vəziyyətini dəyişməyib, əks halda dəyər bdə dəyişəcəkdi. -də olduğu kimi String, sarğı obyektinin vəziyyətini dəyişmək əvəzinə yaddaşda tamamilə yeni obyekt yaradılır. Nə üçün Java yaradıcıları son nəticədə dildə primitiv tipləri saxlamağa qərar verdilər? Hər şey bir obyekt olmalıdır və bizdə ibtidailərin ifadə etdiyi hər şeyi ifadə etmək üçün istifadə edilə bilən sarğı siniflərimiz var, niyə onları dildə qoyub primitivləri silməyək? Cavab sadədir - performans. Primitiv tiplər cisimlərin bir çox “ağır” xüsusiyyətlərindən məhrum olduqları üçün primitiv adlanır. Bəli, obyektin bir çox rahat üsulları var, lakin onlara həmişə ehtiyacınız yoxdur. trueBəzən sizə sadəcə 33 və ya 2.62 rəqəmi və ya / dəyəri lazımdır false. Obyektlərin bütün üstünlüklərinin əhəmiyyətsiz olduğu və proqramın işləməsi üçün lazım olmadığı vəziyyətlərdə primitivlər daha yaxşı iş görəcəklər.

Avtomatik qablaşdırma/avtomatik qablaşdırma

Java-da primitivlərin və onların sarmalayıcı siniflərinin xüsusiyyətlərindən biri autoboxing/autounboxingdir.Gəlin Qablaşdırma, qablaşdırma və qablaşdırma - 2 bu anlayışı anlayaq. Siz və mən əvvəllər öyrəndiyimiz kimi, Java obyekt yönümlü bir dildir. Bu o deməkdir ki, Java-da yazılmış bütün proqramlar obyektlərdən ibarətdir. Primitivlər obyekt deyil. Bununla belə, sarğı sinfi dəyişəninə primitiv tipli qiymət təyin edilə bilər. Bu proses autoboxing adlanır . Eyni şəkildə, primitiv tipli dəyişənə sarğı sinifinin obyekti təyin edilə bilər. Bu proses autounboxing adlanır . Misal üçün:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
5-ci sətirdə ibtidai x-ə sarğı sinifinin obyekti olan y dəyərini təyin edirik Integer. Gördüyünüz kimi, bunun üçün heç bir əlavə hərəkətə ehtiyac yoxdur: kompilyator bunu bilir intIntegerəslində eyni şeydir . Bu avtomatik açılmadır. Eyni şey 6-cı sətirdəki avtoboksla da baş verir: y obyektinə primitivlərin qiyməti asanlıqla təyin olunur (x*123). Bu avtomatik qablaşdırma nümunəsidir. Buna görə "avtomatik" sözü əlavə olunur: onların sarğı siniflərinin obyektlərinə primitiv istinadlar təyin etmək üçün (və əksinə) heç bir şey etmək lazım deyil, hər şey avtomatik olaraq baş verir . Rahat, hə? :) Avtomatik qablaşdırma/avtomatik qablaşdırmanın digər çox böyük rahatlığı üsulların işləməsində özünü göstərir. Fakt budur ki, metod parametrləri də avtomatik qablaşdırmaya və avtomatik açılmaya məruz qalır . Və məsələn, onlardan biri iki obyekti giriş kimi qəbul edərsə Integer, biz orada adi primitivləri asanlıqla keçə bilərik int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
Nəticə: Siz 7 rəqəmini daxil etdiniz. O, əksinə işləyir:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
Xatırlamaq lazım olan vacib bir məqam: avtoboks və qutudan çıxarma massivlər üçün işləmir !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
Primitivlər massivini giriş kimi obyektlər massivi qəbul edən metoda ötürməyə çalışmaq kompilyasiya xətasına səbəb olacaq. Nəhayət, bir daha ibtidai və ibtidai sarğıları qısaca müqayisə edək :
  • performans üstünlüyü var
Qapaqlar:
  • Onlar sizə “hər şey obyektdir” prinsipini pozmamağa imkan verir ki, rəqəmlər, simvollar və boolean dəyərlərin doğru/yanlış bu anlayışdan kənara çıxmasın.
  • Rahat üsullar və sahələr təqdim edərək bu dəyərlərlə işləmək qabiliyyətini genişləndirin
  • Hansısa metod yalnız obyektlərlə işləyə bildikdə lazımdır
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION