Class dan object adalah dua kata yang paling sering diucapkan dalam OOP, dan keduanya sering tertukar oleh pemula. Class adalah cetak biru — definisi bentuk dan perilaku yang ditulis sekali di dalam kode sumber — sedangkan object adalah wujud nyata yang diciptakan dari cetak biru tersebut saat program berjalan. Analogi yang sering dipakai: class adalah rancangan denah rumah, object adalah rumah yang berdiri di atas tanah; satu denah bisa menjadi sepuluh rumah yang isinya berbeda-beda. Pada Chapter ini kita akan membuat class Buku pertama kita, menciptakan object dari class tersebut dengan new, lalu membuktikan lewat percobaan mutasi bagaimana variabel Java menunjuk ke object di memori.
Class sebagai Cetak Biru #
Sebuah class dideklarasikan dengan kata kunci class diikuti nama class dan sepasang kurung kurawal yang membungkus isi class. Isi yang paling sederhana adalah sekumpulan field — variabel yang melekat pada class dan akan dimiliki oleh setiap object yang diciptakan. Berikut class Buku untuk perpustakaan kita:
class Buku {
String judul;
String penulis;
int tahunTerbit;
}Class Buku menyatakan bahwa setiap buku memiliki tiga data: judul, penulis, dan tahunTerbit. Perhatikan bahwa mendeklarasikan class belum menciptakan satu pun buku — persis seperti mencetak denah belum membangun rumah. Class hanyalah deskripsi; belum ada data yang tersimpan, belum ada memori yang dipakai untuk judul atau penulis. Object baru ada ketika program menjalankan new, dan di situlah field-field tersebut benar-benar dialokasikan.
Perhatikan pula bahwa nama field ditulis tanpa kata kunci static. Field seperti ini disebut instance field: setiap object mendapat salinan field-nya sendiri, terpisah dari object lain. Kita akan bedah perbedaannya dengan field static pada Chapter Static Members.
Membuat Object dengan new #
Operator new adalah pintu resmi dari class ke object. Saat JVM mengeksekusi new Buku(), JVM mengalokasikan memori untuk satu object Buku berisi ketiga field-nya, mengisi setiap field dengan nilai bawaan (0 untuk int, null untuk String), lalu mengembalikan referensi — semacam alamat — menuju object tersebut. Referensi itulah yang disimpan ke dalam variabel. Mari kita ciptakan dua object sekaligus:
public class AplikasiPerpustakaan {
public static void main(String[] args) {
Buku bukuA = new Buku();
bukuA.judul = "Laskar Pelangi";
bukuA.penulis = "Andrea Hirata";
bukuA.tahunTerbit = 2005;
Buku bukuB = new Buku();
bukuB.judul = "Bumi Manusia";
bukuB.penulis = "Pramoedya Ananta Toer";
bukuB.tahunTerbit = 1980;
System.out.println("Kondisi awal:");
System.out.println("bukuA -> " + bukuA.judul + " (" + bukuA.tahunTerbit + ")");
System.out.println("bukuB -> " + bukuB.judul + " (" + bukuB.tahunTerbit + ")");
bukuB.tahunTerbit = 1988;
System.out.println("Setelah field bukuB diubah:");
System.out.println("bukuA -> " + bukuA.judul + " (" + bukuA.tahunTerbit + ")");
System.out.println("bukuB -> " + bukuB.judul + " (" + bukuB.tahunTerbit + ")");
Buku salinan = bukuA;
salinan.judul = "Laskar Pelangi (edisi revisi)";
System.out.println("Setelah field salinan diubah:");
System.out.println("bukuA -> " + bukuA.judul);
System.out.println("salinan -> " + salinan.judul);
}
}Output yang Dihasilkan:
Kondisi awal:
bukuA -> Laskar Pelangi (2005)
bukuB -> Bumi Manusia (1980)
Setelah field bukuB diubah:
bukuA -> Laskar Pelangi (2005)
bukuB -> Bumi Manusia (1988)
Setelah field salinan diubah:
bukuA -> Laskar Pelangi (edisi revisi)
salinan -> Laskar Pelangi (edisi revisi)Bagian pertama program membuktikan bahwa dua object dari class yang sama hidup secara independen. Mari kita bedah baris-per-baris:
- Baris 3 (
Buku bukuA = new Buku();):newmenciptakan objectBukupertama dan menyimpan referensinya kebukuA. Tipe variabel ditulisBuku— tipe variabel menyatakan “variabel ini boleh menunjuk objectBuku”. - Baris 4-6 (
bukuA.judul = "Laskar Pelangi";dst.): operator titik mengakses field pada object yang ditunjuk. Kita mengisi data milik object pertama, satu per satu. - Baris 8-11 (
Buku bukuB = new Buku();dst.):newkedua menciptakan objectBukuyang benar-benar terpisah — alokasi memori baru, salinan field baru.bukuBkini menunjuk object kedua. - Baris 17 (
bukuB.tahunTerbit = 1988;): mutasi hanya menyentuh object kedua. Output menunjukkanbukuAtetap memuat2005— bukti kedua object tidak berbagi field meskipun berasal dari class yang sama.
Dua Variabel Menunjuk Object yang Sama #
Bagian kedua program menguji skenario yang berbeda: assignment antar variabel object. Baris Buku salinan = bukuA; tidak menyalin object — assignment hanya menyalin referensi. Setelah baris tersebut, bukuA dan salinan adalah dua nama untuk object yang sama, seperti dua tanda nama terpasang pada pintu rumah yang sama:
Saat salinan.judul diubah, object yang ditunjuk salinan — object yang sama dengan bukuA — berubah isinya. Output membuktikannya: judul pada bukuA ikut berubah padahal baris yang mengubah judul hanya menyebut salinan. Perilaku ini adalah konsekuensi langsung dari fakta bahwa variabel object menyimpan referensi, bukan isi object.
- Baris 22 (
Buku salinan = bukuA;): JVM menyalin isi variabelbukuA— yaitu referensi ke object #1 — ke variabelsalinan. Tidak ada object baru yang diciptakan di baris ini; katanewsama sekali tidak muncul. - Baris 23 (
salinan.judul = "Laskar Pelangi (edisi revisi)";): operator titik mengikuti referensi darisalinanhingga ke object #1, lalu mengganti fieldjudulpada object tersebut. - Baris 26-27 (
System.out.println(...)): kedua baris membaca field dari object #1 lewat dua jalan berbeda, sehingga keduanya mencetak judul revisi yang sama.
Kita kini memegang dua konsep yang kokoh: class sebagai definisi yang ditulis sekali, dan object sebagai entitas ber-memori yang dapat diciptakan banyak kali. Field yang kita pakai sejauh ini masih berupa data pasif yang diisi dari luar. Chapter berikutnya melengkapi separuh yang lain dari sebuah class: methods — perilaku yang membaca dan mengubah field dari dalam object itu sendiri.
Referensi #
- Oracle: dev.java — Object-Oriented Programming
- Java Language Specification — Chapter 8: Classes
- API java.base — java.lang.Object
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
AplikasiPerpustakaan.java
Unduh berkaspublic class AplikasiPerpustakaan {
public static void main(String[] args) {
Buku bukuA = new Buku();
bukuA.judul = "Laskar Pelangi";
bukuA.penulis = "Andrea Hirata";
bukuA.tahunTerbit = 2005;
Buku bukuB = new Buku();
bukuB.judul = "Bumi Manusia";
bukuB.penulis = "Pramoedya Ananta Toer";
bukuB.tahunTerbit = 1980;
System.out.println("Kondisi awal:");
System.out.println("bukuA -> " + bukuA.judul + " (" + bukuA.tahunTerbit + ")");
System.out.println("bukuB -> " + bukuB.judul + " (" + bukuB.tahunTerbit + ")");
bukuB.tahunTerbit = 1988;
System.out.println("Setelah field bukuB diubah:");
System.out.println("bukuA -> " + bukuA.judul + " (" + bukuA.tahunTerbit + ")");
System.out.println("bukuB -> " + bukuB.judul + " (" + bukuB.tahunTerbit + ")");
Buku salinan = bukuA;
salinan.judul = "Laskar Pelangi (edisi revisi)";
System.out.println("Setelah field salinan diubah:");
System.out.println("bukuA -> " + bukuA.judul);
System.out.println("salinan -> " + salinan.judul);
}
}
Buku.java
Unduh berkasclass Buku {
String judul;
String penulis;
int tahunTerbit;
}