Rabu, 14 Desember 2011

this dan super (java)



Meskipun ide dasar dari pemrograman berorientasi objek merupakan konsep yang cukup sederhana dan jelas, akan tetapi untuk memahaminya dengan baik kita membuthkan lebih banyak waktu. Sayangnya, banyak sekali detail yang harus diulas di luar konsep dasarnya. Bagian ini dan bagian berikutnya akan berbicara tentang hal-hal detail, yang tidak perlu dikuasai dalam waktu singkat, akan tetapi pengenalan tentang hal detail ini sangat berguna paling tidak sebagai bahan referensi.

Variabel spesial this dan super

Anggota statik suatu kelas bisa digunakan langsung di dalam kelas tersebut. Untuk digunakan di kelas lain, maka ia harus dipanggil dengan nama lengkapnya dalam bentuk "namaKelas.namaAnggota", misalnya "System.out" adalah variabel anggota statik dengan nama "out" di dalam kelas "System". Kita bisa menggunakan nama lengkap kelas tersebut di manapun, bahkan dari dalam kelas yang sama, misalnya karena nama anggota tersebut disembunyikan oleh variabel lokal yang namanya sama.

Variabel dan metode instansi juga bisa digunakan langsung di dalam kelas tersebut, misalnya suatu variabel instansi bisa digunakan langsung oleh metode instansi di kelas yang sama. Anggota instansi juga memiliki nama lengkap akan tetapi ingat bahwa anggota instansi dimiliki oleh objek, bukan kelas. Sehingga untuk memanggil suatu anggota instansi, kita harus menggunakan nama objek yang diciptakan dari kelas tersebut, dalam bentuk namaObjek.namaAnggota.

Akan tetapi, misalnya kita sedang menulis metode instansi di suatu kelas. Bagaimana caranya kita memanggil anggota instansi kelas yang sama jika kita belum tahu nama objek apa yang diciptakan dari kelas ini?

Java memiliki variabel spesial yang dinamakan "this" yang bisa digunakan untuk kasus di atas. Variabel ini digunakan pada suatu objek untuk memanggil metode atau variabel instansi pada objek yang sama. Maksudnya, this, merujuk pada "objek ini" yaitu objek di mana metode sedang dijalankan. Jika x adalah variabel instansi dalam suatu objek, maka this.x adalah nama lengkap variabel tersebut jika dipanggil dari dalam objek yang sama. Jika metode suatuMetode() adalah metode instansi pada suatu objek, maka this.suatuMetode() bisa digunakan untuk memanggil metode tersebut dari objek yang sama. Ketika komputer menjalankan perintah tersebut, komputer akan mengganti variabel this dengan objek yang berjalan pada saat itu.

Salah satu kegunaaan this adalah pada konstruktor, misalnya :
public class Murid {
    private String nama;  // Nama murid
 
    public Murid(String nama) {
        // Konstruktor, membuat murid dengan nama yang diberikan
        this.nama = nama;
    }
    .
    .   // Variabel dan metode lain.
    .
}


Dalam konstruktor di atas, variabel instansi nama disembunyikan oleh parameter formal yang bernama sama. Akan tetapi, variabel instansi masih tetap bisa dipanggil dengan nama lengkapnya, this.nama. Cara ini merupakan cara yang lazim, artinya kita tidak perlu mengganti nama parameter formal dengan nama lain agar namanya tidak bentrok dengan nama salah satu variabel instansinya. Kita bisa menggunakan nama parameter formal yang sama persis dengan variabel instansinya.

Ada lagi kegunaan lain dari this. Ketika kita sedang menulis metode instansi, kita ingin memberikan objek sebagai parameter aktual. Dalam hal ini, kita bisa menggunakan this sebagai parameter aktualnya. Misalnya, kita ingin mencetak suatu objek sebagai string, kita bisa menggunakan perintah "System.out.println(this);". Atau kita ingin mengisi nilai this ke dalam variabel lain. Pokoknya, kita bisa melakukan segala hal seperti layaknya variabel kecuali mengganti isinya.

Java juga memiliki variabel spesial yang dinamakan "super" untuk digunakan dalam metode instansi. Variabel super digunakan dalam kelas turunan. super mengacu pada objek di mana metode tersebut berada, akan tetapi ia merupakan bagian dari kelas super dari objek tersebut.

Suatu kelas bisa ditambah atau dimodifikasi dari kelas turunannya. Variabel super hanya mengacu pada bagian objek sebelum ia ditambah atau dimodifikasi, atau dengan kata lain bentuk aslinya sebelum dia diturunkan, yang dalam hal ini sama dengan kelas supernya.

Misalnya kita akan menulis suatu kelas, dan kelas tersebut memiliki metode instansi bernama suatuMetode(). Pernyataansuper.suatuMetode() berarti menjalankan suatuMetode() pada kelas supernya. Jika tidak ada metode sutuMetode() pada kelas supernya, Java akan menampilkan pesan kesalahan sintaks.

Alasan mengapa Java memiliki variabel super adalah karena banyak hal yang mungkin tersembunyi pada kelas turunan. Misalnya karena kita mengimplementasikan fungsi lain pada kelas turunan dengan nama yang sama (dalam kaitannya dengan polimorfisme, misalkan).

Ketika kita membuat metode baru pada kelas turunan yang memiliki nama dan jenis parameter yang sama dengan metode pada kelas supernya, metode dari kelas super akan disembunyukan. Dalam bahasa pemrograman, metode ini menimpa (override) metode dari kelas supernya. Variabel super bisa digunakan untuk mengakses metode aslinya yang didefinisikan di kelas supernya.

Kegunaan utama dari super biasanya untuk memperluas kegunaan metode yang sudah ada, bukan menggantinya secara keseluuruhan. Metode baru bisa menggunakan super untuk menjalankan instruksi pada kelas supernya, kemudian menambahkan instruksi lain pada kelas turunannya.

Misalnya, kita memiliki kelas PasanganDadu yang memiliki metode kocok. Kemudian kita akan membuat kelas turunan yaituDaduGrafis yang berfungsi untuk menggambar dadu pada layar. Metode kocok() dalam DaduGrafis harus melakukan apa yang dilakukan oleh PasanganDadu, dengan tambahan perintah untuk menggambar dadu tersebut di layar. Kita bisa tulis definisi kelas DaduGrafis dalam bentuk :
public class DaduGrafis extends PasanganDadu {
    public void kocok() {
        // Mengocok dadu, kemudian menggambarnya di layar
        super.kocok();  // Panggil metode kocok() di kelas PasanganDadu
        gambar();      // Gambar ulang dadu
    }
    .
    .  // Metode dan variabel lain, termasuk metode gambar()
    .
}


Dengan cara ini kita bisa memperluas apa yang dilakukan oleh metode kocok() pada kelas supernya tanpa mengetahui dengan detail apa yang dilakukan langkah per langkah di kelas supernya.

Konstuktor pada Kelas Turunan


Konstruktor tidak bisa diturunkan, artinya jika kita membuat kelas turunan dari suatu kelas, konstruktor pada kelas supernya tidak termasuk bagian yang diturunkan. Jika kita ingin konstruktor tersebut pada kelas turunannya, maka kita harus membuat kembali konstruktor tersebut di kelas yang baru. Jika tidak, maka Java akan membuat konstruktor standar tanpa parameter apa-apa.

Hal ini mungkin menjadi masalah jika konstruktor pada kelas supernya melakukan banyak tugas. Artinya kita harus mengulang kembali menuliskan semua instruksi pada kelas supernya di kelas turunan yang baru. Masalahnya akan lebih rumit jika kita tidak mengetahui sama sekali apa yang dilakukan kelas supernya, misalnya apabila tidak ada kode sumbernya.

Cara yang paling mudah adalah menggunakan super. Di baris pertama konstruktor baru kita di kelas turunannya, kita bisa menggunakan super untuk memanggil konstruktor kelas supernya. Sintaksnya sedikit aneh dan membingungkan, dan hanya bisa digunakan untuk satu situasi saja : Sintaksnya mirip seperti memanggil subrutin super (meskipun sebenarnya super bukan subrutin dan kita tidak bisa memanggil konstruktor seperti kita memanggil subrutin biasa).

Misalnya kelas PasanganDadu memiliki konstruktor yang memiliki dua parameter bertipe int. Maka kita bisa membuat konstruktor pada kelas DaduGrafis seperti :
public class DaduGrafis extends PasanganDadu {
 
    public DaduGrafis() {  // Konstruktor kelas ini
        super(3,4);  // Panggil konstruktor dari kelas PasanganDadu
                     // dengan parameter 3 dan 4
        inisialisasiGrafis();  // Lakukan inisialisasi grafis
                               // untuk digunakan pada kelas DaduGrafis
    }
    .
    .  // Konstruktor, variabel dan metode instansi lain
    .
}

Tidak ada komentar:

Posting Komentar