JavaRush /Blog Jawa /Random-JV /Bungkus, unwrapping lan packing

Bungkus, unwrapping lan packing

Diterbitake ing grup
Hello! Sampeyan wis cukup menowo jinis primitif, lan wis kerjo karo wong akeh. Bungkus, bukak lan packing - 1Primitif ing program, lan ing Jawa ing tartamtu, duwe akeh kaluwihan: padha njupuk munggah sethitik memori, mangkono nambah efficiency program, lan cetha dipérang dadi sawetara saka nilai. Nanging, ing proses sinau basa Jawa, kita wis bola-bali luwih saka sepisan, kaya mantra, " ing Jawa kabeh iku obyek ." Nanging primitif minangka bantahan langsung saka tembung kasebut. Padha ora obyek. Dadi prinsip "kabeh iku obyek" iku palsu? Ora temenan. Ing Jawa, saben jinis primitif duwe sedulur kembar, yaiku kelas bungkus ( Wrapper). Apa iku bungkus? Pambungkus minangka kelas khusus sing nyimpen nilai primitif ing njero dhewe. Nanging amarga iki kelas, bisa nggawe kedadean dhewe. Dheweke bakal nyimpen nilai primitif sing dibutuhake ing njero, nalika dadi obyek nyata. Jeneng kelas pambungkus meh padha karo jeneng primitif sing cocog, utawa cocog karo dheweke. Mulane, bakal gampang banget kanggo ngelingi wong-wong mau.
Kelas Wrapper kanggo Jinis Data Primitif
Jinis Data Primitif Kelas Wrapper
int Ongko
cendhak Singkat
dawa dawa
bait Byte
ngambang ngambang
pindho pindho
char Watak
boolean Boolean
Objek kelas Wrapper digawe kaya liyane:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Kelas Wrapper ngidini sampeyan nyuda kekurangan sing ana ing jinis primitif. Sing paling jelas yaiku primitif ora duwe metode . Contone, padha ora duwe cara toString(), supaya sampeyan ora bisa, contone, Ngonversi nomer intmenyang senar. Nanging kanthi kelas pambungkus Integeriku gampang.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Ana uga kangelan karo transformasi mbalikke. Ayo kita duwe senar sing kita ngerti manawa ngemot nomer. Nanging, ing kasus jinis primitif, intkita ora bakal bisa njaluk nomer iki saka senar lan nguripake iku, nyatane, menyang nomer. Nanging thanks kanggo kelas wrapper, kita saiki duwe kesempatan iki.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Output: 1166628 Kita wis kasil njupuk nomer saka senar lan diutus kanggo variabel referensi Integer i. Miturut cara, babagan pranala. Sampeyan wis ngerti yen paramèter dikirim menyang cara kanthi cara sing beda-beda: primitif dilewati kanthi nilai, lan obyek dilewati kanthi referensi. Sampeyan bisa nggunakake kawruh iki nalika nggawe cara: yen cara sampeyan bisa, contone, karo nomer pecahan, nanging sampeyan kudu logika liwat referensi, sampeyan bisa pass paramèter kanggo cara Double/Floattinimbang double/float. Kajaba iku, saliyane metode, kelas pambungkus duwe lapangan statis sing trep banget kanggo digunakake. Contone, bayangake yen sampeyan saiki lagi ngadhepi tugas: nyetak nomer maksimal menyang konsol int, banjur nomer minimal sing bisa ditindakake. Tugas kasebut katon minangka dhasar, nanging sampeyan ora bakal bisa nindakake tanpa Google. Lan kelas pambungkus kanthi gampang ngidini sampeyan ngatasi "masalah saben dina" ing ngisor iki:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Kolom kasebut ngidini sampeyan ora keganggu saka tugas sing luwih serius. Ora kanggo sebutno kasunyatan sing ing proses printing nomer 2147483647 (iki persis MAX_VALUE) iku ora ngageti salah ngetik :) Kajaba iku, ing salah siji saka ceramah sadurunge kita wis narik kawigaten manungsa waé kanggo kasunyatan sing obyek saka kelas wrapper. ora bisa owah (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 Obyek sing referensi asline аora owah, yen ora, regane buga bakal diganti. Kaya String, tinimbang ngganti kahanan obyek pambungkus, obyek sing anyar digawe ing memori. Apa sebabe para pangripta Jawa pungkasane mutusake kanggo njaga jinis primitif ing basa kasebut? Amarga kabeh kudu dadi obyek, lan kita wis duwe kelas bungkus sing bisa digunakake kanggo nyebutake kabeh sing diucapake primitif, kenapa ora mung ninggalake basa kasebut lan mbusak primitif? Jawaban iki prasaja - kinerja. Jinis primitif diarani primitif amarga padha ora duwe akeh fitur "abot" obyek. Ya, obyek nduweni akeh cara sing trep, nanging sampeyan ora perlu. Kadhangkala sampeyan mung butuh angka 33, utawa 2.62, utawa nilai true/ false. Ing kahanan sing kabeh mupangat obyek ora relevan lan ora dibutuhake kanggo program kasebut, primitif bakal nindakake tugas sing luwih apik.

Auto-packing/otomatis unpacking

Salah sawijining fitur primitif lan kelas pembungkus ing Jawa yaiku autoboxing/autounboxing, Bungkus, bukak lan packing - 2 ayo padha ngerti konsep iki. Kados ingkang sampun kula lan panjenengan sinau rumiyin, basa Jawi menika kalebet basa ingkang berorientasi objek. Iki tegese kabeh program sing ditulis ing Jawa digawe saka obyek. Primitif dudu obyek. Nanging, variabel kelas pambungkus bisa diwenehi nilai saka jinis primitif. Proses iki diarani autoboxing . Kanthi cara sing padha, variabel saka jinis primitif bisa diwenehi obyek saka kelas pambungkus. Proses iki diarani autounboxing . Tuladhane:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
Ing baris 5, kita nemtokake nilai x primitif saka y, yaiku obyek saka kelas pambungkus Integer. Kaya sing sampeyan ngerteni, ora ana tumindak tambahan sing dibutuhake kanggo iki: kompiler ngerti intlan Integer, nyatane, perkara sing padha . Iki mbongkar otomatis. Bab sing padha kedadeyan karo autoboxing ing baris 6: obyek y gampang diwenehi nilai primitif (x * 123). Iki minangka conto autopacking. Mulane tembung "otomatis" ditambahake: kanggo nemtokake referensi primitif kanggo obyek saka kelas pambungkus (lan kosok balene) sampeyan ora perlu nindakake apa-apa, kabeh kedadeyan kanthi otomatis . Trep, ta? :) Penak liyane sing apik banget kanggo ngemas otomatis / mbongkar otomatis diwujudake ing operasi metode kasebut. Kasunyatane yaiku paramèter metode uga tundhuk autopacking lan autounpacking . Lan, contone, yen salah siji saka wong-wong mau njupuk rong obyek minangka input Integer, kita bisa gampang pass primitif biasa ana 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: Sampeyan ngetik nomer 7. Kerjane 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);
   }
}
Titik penting kanggo elinga: autoboxing lan unboxing ora bisa digunakake kanggo 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));
   }
}
Nyoba ngirim array primitif menyang metode sing njupuk macem-macem obyek minangka input bakal nyebabake kesalahan kompilasi. Pungkasan, ayo mbandhingake maneh primitif lan bungkus Primitif:
  • duwe kaluwihan kinerja
Bungkus:
  • Dheweke ngidini sampeyan ora nglanggar prinsip "kabeh iku obyek", supaya angka, simbol lan nilai boolean bener / salah ora metu saka konsep iki.
  • Nggedhekake kemampuan kanggo nggarap nilai kasebut kanthi menehi cara lan lapangan sing trep
  • Perlu nalika sawetara cara bisa digunakake sacara eksklusif karo obyek
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION