"Memandangkan pembangun boleh menghasilkan kelas yang menerangkan nombor, mereka memutuskan untuk menjadi kreatif, seperti pembangun sebenar."
"Pertama, mereka menghasilkan kelas Nombor abstrak, dari mana Byte, Short, Integer, Long, Float dan Double diperolehi. Ia mempunyai kaedah yang membantu menukar nombor kepada jenis angka lain."
Kaedah kelas Nombor | |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"Betul. Lagipun, anda tidak boleh menulis ini:"
Long x = 100000;
Integer y = (Integer) x;
"Ya, jenis ini bukan primitif. Itulah sebabnya kami menggunakan kaedah kelas Nombor:"
Long x = 100000;
Integer y = x.intValue();
"Tetapi masih terdapat beberapa perkara yang perlu dipertimbangkan. Oleh kerana Integer bukan int, objek Integer tidak boleh dibandingkan dengan operator «==» klasik."
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
"Betul. Entah kenapa saya tak terfikir langsung."
"Tetapi ada lagi."
"Kamu memendekkan litar saya! Apa lagi yang ada?"
"Apabila kami memberikan nilai int kepada pembolehubah Integer, kaedah Integer.valueOf dipanggil:"
Kod | Apa sebenarnya yang berlaku |
---|---|
|
|
"Ya, saya sudah faham itu daripada contoh di atas."
"Tetapi, fungsi valueOf tidak selalu mencipta objek Integer baharu."
"Eh, apa maksud awak «bukan selalu»?"
"Ia menyimpan nilai dari -128 hingga 127."
Kod | Apa sebenarnya yang berlaku | Penerangan |
---|---|---|
|
|
Pembolehubah x, y dan z mengandungi rujukan kepada objek yang berbeza |
|
|
Pembolehubah x, y dan z mengandungi rujukan kepada objek yang sama. |
|
|
Pembolehubah z dan t mengandungi rujukan kepada objek yang sama. |
"Dengan kata lain, keadaannya begini:"
1) Jika kami menulis «new Integer()», maka kami dijamin mendapat objek baharu.
2) Jika kita memanggil Integer.valueOf(), secara eksplisit atau melalui autoboxing, maka kaedah itu boleh mengembalikan objek baharu atau objek cache jika hujah nombor berada dalam julat dari -128 hingga 127.
"Apa yang teruk tentang kaedah mengembalikan objek daripada cache?"
"Tidak mengapa. Anda hanya perlu tahu bahawa kadangkala, apabila anda tidak menjangkakannya, objek mungkin sama. Segala-galanya dengan kesamaan adalah rumit. Jika kita membandingkan primitif dengan bukan primitif, maka ia dibandingkan sebagai primitif:"
int x = 300;
Integer y = 300;
Integer z = 300;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
int x = 100;
Integer y = 100;
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
int x = 100;
Integer y = new Integer(100);
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)
"Hebat... Dan bagaimana saya akan menghafal semua ini?"
"Anda tidak perlu menghafal ini. Anda hanya perlu memahami bagaimana ini semua diatur dan apa yang sebenarnya berlaku apabila primitif dan rakan sejawatannya yang bukan primitif terlibat."
"Saya juga mengesyorkan agar anda melihat kaedah kelas Integer. Ia mempunyai beberapa kaedah yang baik dan berguna. Malah anda telah menggunakan salah satu daripadanya dengan kerap."
"Ya, saya ingat. Integer.parseInt();"
GO TO FULL VERSION