JavaRush /Blog Java /Random-MS /Membungkus, membuka balutan dan membungkus

Membungkus, membuka balutan dan membungkus

Diterbitkan dalam kumpulan
hello! Anda sudah biasa dengan jenis primitif, dan telah banyak bekerja dengan mereka. Membungkus, membuka balutan dan membungkus - 1Primitif dalam pengaturcaraan, dan dalam Java khususnya, mempunyai banyak kelebihan: mereka mengambil sedikit memori, dengan itu meningkatkan kecekapan program, dan dibahagikan dengan jelas kepada julat nilai. Walau bagaimanapun, dalam proses pembelajaran Java, kami telah mengulangi lebih daripada sekali, seperti mantra, " di Jawa semuanya adalah objek ." Tetapi primitif adalah sanggahan langsung kata-kata ini. Mereka bukan objek. Jadi prinsip "semuanya adalah objek" adalah palsu? Tidak juga. Di Jawa, setiap jenis primitif mempunyai saudara kembarnya, kelas pembungkus ( Wrapper). Apakah pembalut? Pembalut ialah kelas khas yang menyimpan nilai primitif di dalam dirinya. Tetapi kerana ini adalah kelas, ia boleh mencipta kejadian sendiri. Mereka akan menyimpan nilai primitif yang diperlukan di dalam, sambil menjadi objek sebenar. Nama kelas pembalut sangat serupa dengan nama primitif yang sepadan, atau bertepatan sepenuhnya dengan mereka. Oleh itu, ia akan menjadi sangat mudah untuk mengingati mereka.
Kelas Pembungkus untuk Jenis Data Primitif
Jenis Data Primitif Kelas Pembungkus
int Integer
pendek Pendek
panjang Panjang
bait Bait
terapung Terapung
berganda berganda
char Perwatakan
boolean Boolean
Objek kelas pembungkus dicipta sama seperti yang lain:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Kelas pembungkus membolehkan anda mengurangkan kelemahan yang dimiliki oleh jenis primitif. Yang paling jelas ialah primitif tidak mempunyai kaedah . Sebagai contoh, mereka tidak mempunyai kaedah toString(), jadi anda tidak boleh, contohnya, menukar nombor intkepada rentetan. Tetapi dengan kelas pembalut Integeria mudah.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Terdapat juga kesukaran dengan transformasi terbalik. Katakan kita mempunyai rentetan yang kita tahu pasti mengandungi nombor. Walau bagaimanapun, dalam kes jenis primitif, intkita tidak akan dapat mendapatkan nombor ini daripada rentetan dan mengubahnya, sebenarnya, menjadi nombor. Tetapi terima kasih kepada kelas pembalut, kami kini mempunyai peluang ini.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Output: 1166628 Kami telah berjaya mendapatkan semula nombor daripada rentetan dan menetapkannya kepada pembolehubah rujukan Integer i. Dengan cara ini, mengenai pautan. Anda sudah tahu bahawa parameter dihantar kepada kaedah dengan cara yang berbeza: primitif diluluskan oleh nilai, dan objek diluluskan melalui rujukan. Anda boleh menggunakan pengetahuan ini apabila mencipta kaedah anda: jika kaedah anda berfungsi, contohnya, dengan nombor pecahan, tetapi anda memerlukan logik untuk lulus melalui rujukan, anda boleh menghantar parameter kepada kaedah Double/Floatdan bukannya double/float. Di samping itu, sebagai tambahan kepada kaedah, kelas pembalut mempunyai medan statik yang sangat mudah digunakan. Sebagai contoh, bayangkan bahawa anda kini berhadapan dengan tugas: cetak nombor maksimum yang mungkin ke konsol int, dan kemudian nombor minimum yang mungkin. Tugas itu nampaknya asas, tetapi anda masih sukar untuk melakukannya tanpa Google. Dan kelas pembalut dengan mudah membolehkan anda menyelesaikan "masalah harian" berikut:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Bidang sedemikian membolehkan anda tidak terganggu daripada tugas yang lebih serius. Belum lagi fakta bahawa dalam proses mencetak nombor 2147483647 (ini betul-betul MAX_VALUE) tidak menghairankan untuk salah taip :) Di samping itu, dalam salah satu kuliah sebelumnya kami telah menarik perhatian kepada fakta bahawa objek kelas pembalut adalah tidak berubah (Immutable) .
public static void main(String[] args) {

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

   b = a;
   a = 1;
   System.out.println(b);
}
Output: 0 Objek yang ditunjuk pada asalnya rujukan аtidak mengubah keadaannya, jika tidak nilainya bjuga akan berubah. Seperti String, bukannya menukar keadaan objek pembalut, objek yang sama sekali baru dicipta dalam ingatan. Mengapakah pencipta Java akhirnya memutuskan untuk mengekalkan jenis primitif dalam bahasa tersebut? Memandangkan semuanya harus menjadi objek, dan kami sudah mempunyai kelas pembalut yang boleh digunakan untuk menyatakan semua yang dinyatakan oleh primitif, mengapa tidak biarkan sahaja dalam bahasa dan alih keluar primitif? Jawapannya mudah - prestasi. Jenis primitif dipanggil primitif kerana ia tidak mempunyai banyak ciri "berat" objek. Ya, objek mempunyai banyak kaedah yang mudah, tetapi anda tidak selalu memerlukannya. Kadangkala anda hanya memerlukan nombor 33, atau 2.62, atau nilai true/ false. Dalam situasi di mana semua faedah objek tidak relevan dan tidak diperlukan untuk program berfungsi, primitif akan melakukan kerja yang lebih baik.

Auto-packing/auto-unpacking

Salah satu ciri primitif dan kelas pembalutnya dalam Java ialah autoboxing/autounboxing. Membungkus, membuka balutan dan membungkus - 2 Mari kita fahami konsep ini. Seperti yang anda dan saya telah pelajari sebelum ini, Java ialah bahasa berorientasikan objek. Ini bermakna semua program yang ditulis dalam Java terdiri daripada objek. Primitif bukan objek. Walau bagaimanapun, pembolehubah kelas pembalut boleh diberikan nilai jenis primitif. Proses ini dipanggil autoboxing . Dengan cara yang sama, pembolehubah jenis primitif boleh diberikan objek kelas pembalut. Proses ini dipanggil autounboxing . Sebagai contoh:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
Pada baris 5, kami menetapkan primitif x nilai y, yang merupakan objek kelas pembalut Integer. Seperti yang anda lihat, tiada tindakan tambahan diperlukan untuk ini: pengkompil mengetahui itu intdan Integer, sebenarnya, perkara yang sama . Ini ialah pembongkaran automatik. Perkara yang sama berlaku dengan autoboxing dalam baris 6: objek y mudah diberikan nilai primitif (x*123). Ini adalah contoh autopacking. Itulah sebabnya perkataan "auto" ditambah: untuk memberikan rujukan primitif kepada objek kelas pembalutnya (dan sebaliknya) anda tidak perlu melakukan apa-apa, semuanya berlaku secara automatik . Mudah, bukan? :) Satu lagi kemudahan yang sangat hebat untuk pembungkusan automatik/pembukaan automatik ditunjukkan dalam pengendalian kaedah. Hakikatnya ialah parameter kaedah juga tertakluk kepada autopacking dan autounpacking . Dan, sebagai contoh, jika salah seorang daripada mereka mengambil dua objek sebagai input Integer, kita boleh dengan mudah menghantar primitif biasa di sana 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);
   }
}
Output: Anda memasukkan nombor 7. Ia berfungsi sebaliknya:
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);
   }
}
Perkara penting untuk diingat: autoboxing dan unboxing tidak berfungsi untuk tatasusunan !
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));
   }
}
Cuba untuk menghantar tatasusunan primitif kepada kaedah yang mengambil tatasusunan objek sebagai input akan menyebabkan ralat penyusunan. Akhir sekali, mari kita bandingkan secara ringkas primitif dan pembalut Primitif:
  • mempunyai kelebihan prestasi
Pembungkus:
  • Mereka membenarkan anda untuk tidak melanggar prinsip "semuanya adalah objek", supaya nombor, simbol dan nilai boolean benar/salah tidak terkeluar daripada konsep ini
  • Kembangkan keupayaan untuk bekerja dengan nilai ini dengan menyediakan kaedah dan medan yang mudah
  • Diperlukan apabila beberapa kaedah boleh berfungsi secara eksklusif dengan objek
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION