JavaRush /Java Blog /Random-ID /Membungkus, membuka bungkus dan mengemas

Membungkus, membuka bungkus dan mengemas

Dipublikasikan di grup Random-ID
Halo! Anda sudah cukup familiar dengan tipe primitif, dan telah banyak bekerja dengannya. Membungkus, membuka bungkus dan mengemas - 1Primitif dalam pemrograman, dan khususnya di Java, memiliki banyak keunggulan: hanya menggunakan sedikit memori, sehingga meningkatkan efisiensi program, dan jelas dibagi ke dalam rentang nilai. Namun, dalam proses belajar Java, kami mengulangi lebih dari satu kali, seperti mantra, “ di Java segala sesuatu adalah objek .” Tapi kaum primitif adalah sanggahan langsung terhadap kata-kata ini. Mereka bukanlah objek. Jadi prinsip “segala sesuatu adalah objek” salah? Tidak terlalu. Di Java, setiap tipe primitif mempunyai saudara kembarnya, kelas wrapper ( Wrapper). Apa itu pembungkus? Wrapper adalah kelas khusus yang menyimpan nilai primitif di dalamnya. Namun karena ini adalah sebuah kelas, ia dapat membuat instance-nya sendiri. Mereka akan menyimpan nilai-nilai primitif yang diperlukan di dalamnya, sekaligus menjadi objek nyata. Nama-nama kelas pembungkus sangat mirip dengan nama-nama primitif yang bersangkutan, atau sepenuhnya bertepatan dengan nama-nama tersebut. Oleh karena itu, akan sangat mudah untuk mengingatnya.
Kelas Wrapper untuk Tipe Data Primitif
Tipe Data Primitif Kelas Pembungkus
ke dalam Bilangan bulat
pendek Pendek
panjang Panjang
byte byte
mengambang Mengambang
dobel Dobel
arang Karakter
boolean Boolean
Objek kelas wrapper dibuat sama seperti objek lainnya:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Kelas wrapper memungkinkan Anda mengurangi kelemahan yang dimiliki tipe primitif. Yang paling jelas adalah bahwa kaum primitif tidak memiliki metode . Misalnya, mereka tidak memiliki metode toString(), jadi Anda tidak dapat, misalnya, mengonversi angka intmenjadi string. Namun dengan kelas wrapper, Integerhal ini menjadi mudah.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Transformasi sebaliknya juga akan menimbulkan kesulitan. Katakanlah kita memiliki string yang kita tahu pasti berisi angka. Namun, dalam kasus tipe primitif, intkita tidak akan bisa mendapatkan nomor ini dari string dan mengubahnya menjadi nomor. Namun berkat kelas wrapper, kami sekarang memiliki kesempatan ini.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Output: 1166628 Kami telah berhasil mengambil nomor dari string dan menugaskannya ke variabel referensi Integer i. Berbicara tentang tautan. Anda sudah mengetahui bahwa parameter diteruskan ke metode dengan cara yang berbeda: primitif diteruskan berdasarkan nilai, dan objek diteruskan dengan referensi. Anda dapat menggunakan pengetahuan ini saat membuat metode Anda: jika metode Anda berfungsi, misalnya, dengan bilangan pecahan, tetapi Anda memerlukan logika meneruskan referensi, Anda dapat meneruskan parameter ke metode tersebut, Double/Floatbukan double/float. Selain itu, selain metode, kelas wrapper memiliki bidang statis yang sangat nyaman digunakan. Misalnya, bayangkan Anda sekarang dihadapkan pada tugas: mencetak angka maksimum yang mungkin ke konsol int, lalu angka minimum yang mungkin. Tugas ini tampaknya sederhana, namun tetap saja, Anda tidak akan dapat melakukannya tanpa Google. Dan kelas wrapper dengan mudah memungkinkan Anda memecahkan “masalah sehari-hari” berikut:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Bidang seperti itu memungkinkan Anda untuk tidak terganggu dari tugas yang lebih serius. Belum lagi dalam proses pencetakan angka 2147483647 (ini tepatnya MAX_VALUE) tidak heran jika salah ketik :) Selain itu, pada salah satu kuliah sebelumnya kita telah memperhatikan fakta bahwa objek kelas pembungkus tidak dapat diubah .
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 awalnya ditunjuk oleh referensi аtidak berubah statusnya, jika tidak, nilainya bjuga akan berubah. Seperti halnya String, alih-alih mengubah status objek pembungkus, objek yang sepenuhnya baru dibuat di memori. Mengapa pencipta Java akhirnya memutuskan untuk mempertahankan tipe primitif dalam bahasanya? Karena semuanya harus berupa objek, dan kita sudah memiliki kelas wrapper yang dapat digunakan untuk mengekspresikan segala sesuatu yang diungkapkan oleh primitif, mengapa tidak membiarkannya dalam bahasa tersebut dan menghapus primitifnya? Jawabannya sederhana - kinerja. Tipe primitif disebut primitif karena tidak memiliki banyak fitur “berat” pada objek. Ya, suatu objek memiliki banyak metode yang mudah digunakan, tetapi Anda tidak selalu membutuhkannya. Terkadang Anda hanya membutuhkan angka 33, atau 2,62, atau nilai true/ false. Dalam situasi di mana semua manfaat objek tidak relevan dan tidak diperlukan agar program dapat bekerja, primitif akan melakukan pekerjaan yang jauh lebih baik.

Pengemasan otomatis/pembongkaran otomatis

Salah satu fitur primitif dan kelas pembungkusnya di Java adalah autoboxing/autounboxing. Membungkus, membuka bungkus dan mengemas - 2 Mari kita pahami konsep ini. Seperti yang Anda dan saya pelajari sebelumnya, Java adalah bahasa berorientasi objek. Artinya semua program yang ditulis di Java terdiri dari objek. Primitif bukanlah objek. Namun, variabel kelas wrapper dapat diberi nilai tipe primitif. Proses ini disebut autoboxing . Dengan cara yang sama, variabel bertipe primitif dapat ditugaskan ke objek kelas pembungkus. Proses ini disebut autounboxing . Misalnya:
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, kita menetapkan nilai y ke primitif x, yang merupakan objek kelas pembungkus Integer. Seperti yang Anda lihat, tidak ada tindakan tambahan yang diperlukan untuk ini: kompiler mengetahui hal itu intdan Integer, pada kenyataannya, hal yang sama . Ini adalah pembongkaran otomatis. Hal yang sama terjadi dengan autoboxing pada baris 6: objek y dengan mudah diberi nilai primitif (x*123). Ini adalah contoh pengepakan otomatis. Inilah sebabnya mengapa kata "otomatis" ditambahkan: untuk menetapkan referensi primitif ke objek kelas pembungkusnya (dan sebaliknya), Anda tidak perlu melakukan apa pun, semuanya terjadi secara otomatis . Nyaman, bukan? :) Kenyamanan lain yang sangat luar biasa dari pengepakan otomatis/pembongkaran otomatis diwujudkan dalam pengoperasian metode. Faktanya adalah bahwa parameter metode juga tunduk pada autopacking dan autounpacking . Dan, misalnya, jika salah satu dari mereka mengambil dua objek sebagai masukan Integer, kita dapat dengan mudah meneruskan primitif biasa ke 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);
   }
}
Keluaran: Anda memasukkan angka 7. Cara kerjanya 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);
   }
}
Hal penting yang perlu diingat: autoboxing dan unboxing tidak berfungsi untuk array !
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));
   }
}
Mencoba meneruskan array primitif ke metode yang mengambil array objek sebagai masukan akan menyebabkan kesalahan kompilasi. Terakhir, mari kita sekali lagi membandingkan secara singkat primitif dan pembungkus Primitif:
  • memiliki keunggulan kinerja
Pembungkus:
  • Mereka mengizinkan Anda untuk tidak melanggar prinsip “segala sesuatu adalah objek”, sehingga angka, simbol, dan nilai boolean benar/salah tidak keluar dari konsep ini
  • Perluas kemampuan untuk bekerja dengan nilai-nilai ini dengan menyediakan metode dan bidang yang mudah digunakan
  • Diperlukan ketika beberapa metode dapat bekerja secara eksklusif dengan objek
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION