POLYMORPHISM
Pengantar
• Polimorfisme
– Memungkinkan "pemrograman berbentuk umum“
– Pemanggilan dengan cara yang sama (nama metode dan parameter yang sama) dapat menghasilkan "banyak bentuk"
• Interface
– Diimplementasikan oleh kelas untuk menetapkan
fungsi umum untuk kelas-kelas yang bisa-jadi tidak
memiliki relasi
Manfaat Polimorfisme
• Polimorfisme
– Ketika sebuah metode dipanggil melalui variabel superkelas, didasarkan atas tipe referensi variabel superkelas, dipanggil versi metode subkelas yang tepat/sesuai.
– Nama metode dan parameter yang sama dapat
melakukan tindakan berbeda, tergantung tipe objek (kelas) tempat metode dipanggil
– Memfasilitasi penambahkan kelas baru pada sistem dengan sedikit modifikasi pada kode program
Catatan
• Polimorfisme memungkinkan programmer dapat menangani generalisasi dan membiarkan komputer menangani secara spesifik. Pemrogram dapat memerintahkan objek untuk
berperilaku sesuai objek , tanpa mengetahui tipe obyek (asalkan objek memiliki hirarki pewarisan yang sama).
• Polimorfisme meningkatkan ekstensibilitas: Software yang
memanggil perilaku polimorfik tidak bergantung pada tipe objek yang mengirim pesan. Tipe objek baru yang dapat merespon
terhadap panggilan metode yang ada dapat dimasukkan ke dalam sistem tanpa memerlukan modifikasi dari sistem
sebelumnya. Hanya kode klien yang menginstantiasi objek baru harus dimodifikasi untuk mengakomodasi kelas baru
Perilaku Polimorfik
• Sebuah referensi superkelas dapat ditujukan pada obyek subkelas
– Hal ini dimungkinkan karena obyek subkelas merupakan obyek superkelas juga
– Ketika memanggil metode dari referensi di atas, tipe objek direferensikan ke objek sebenarnya, bukan
tipe referensi, menentukan metode yang dipanggil
• Sebuah referensi subkelas dapat ditujukan pada obyek superkelas hanya jika objek tersebut
di-”downcasted”
Contoh Polimorpisme
Contoh Polimorpisme ( lanjutan )
Kelas dan Metode Abstrak
• Kelas abstrak
– Kelas bersifat umum untuk membuat objek
– Digunakan hanya sebagai superkelas abstrak untuk
diimplementasikan pada subkelas dan untuk mendeklarasikan variabel referensi
– Banyak hirarki pewarisan memiliki superkelas abstrak yang ditempatkan beberapa level di posisi atas
– Keyword abstract
• Digunakan untuk mendeklarasikan kelas abstrak
• Juga digunakan untuk mendeklarasikan sebuah metode abstrak
– Kelas abstrak biasanya mempunyai satu atau lebih metode abstrak
– Semua implementasi subkelas dari superkelas abstrak harus mengoverride semua metode abstrak warisan
Kelas dan Metode Abstrak (
lanjutan)
• Kelas Iterator
– Seperti sebuah array objek, dapat dipakai
menjelajah di semua objek dalam sekumpulan objek (array objek)
– Sering digunakan dalam pemrograman polimorfik
untuk dapat menjelajah sekumpulan referensi objek
dari berbagai tingkat hirarki pewarisan.
Catatan
• Sebuah kelas abstrak mendeklarasikan atribut dan metode umum dari berbagai kelas dalam hirarki kelas. Sebuah kelas abstrak biasanya berisi satu atau lebih metode abstrak
dimana subkelas wajib mengoverride jika subkelas harus
dibuat objek. Variabel instan dan implementasi metode dari kelas abstrak harus mengikuti aturan dalam pewarisan.
• Kesalahan kompilasi akan terjadi ketika melakukan instansiasi dari kelas abstrak.
• Tidak melakukan implementasi metode abstrak superkelas di subkelas akan menghasilkan kesalahan kompilasi kecuali bila di subkelas juga dideklarasikan sebagai metode abstrak.
Hirarki Pewarisan Karyawan
Karyawan Karyawan
KaryawanHarian
KaryawanHarian KaryawanKomisiKaryawanKomisi
KaryawanKomisiTetap KaryawanKomisiTetap KaryawanTetap
KaryawanTetap
Catatan
• Sebuah subkelas dapat mewarisi "interface" atau "implementasi"
dari superkelas. Hierarki dirancang untuk pewarisan
implementasi cenderung memiliki fungsionalitas yang tinggi dalam hirarki. Setiap subkelas baru mewarisi satu atau lebih metode yang diimplementasi di superkelas, dan subkelas dapat menggunakan implementasi superkelas tersebut.
• Hierarki dirancang untuk pewarisan “interface” yang cenderung memiliki fungsionalitas lebih rendah dalam hirarki. Superkelas menentukan satu atau lebih metode abstrak yang harus
dideklarasikan untuk setiap kelas implementasinya dalam hirarki, dan subkelas secara individu harus melakukan override metode ini untuk menyediakan implementasi subkelas yang spesifik.
Catatan
• Superkelas abstrak: Karyawan
– Metode getGaji() dideklarasikan abstrak
• Tidak ada implementasi dapat diberikan untuk metode getGaji() di kelas abstrak Karyawan
– Sebuah variabel array Karyawan akan menyimpan referensi pada obyek-obyek subkelas
• pemanggilan metode getGaji() dari variabel-variabel ini akan memanggil versi metode getGaji() yang sesuai
Contoh Polimorpisme
Contoh Polimorpisme (
lanjutan)
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Contoh Polimorpisme ( lanjutan )
Proses Polimorfisme
• Pengikatan dinamis (Dinamic Binding)
– Juga disebut sebagai “late binding”
– Pemanggilan metode override dijalankan pada
waktu eksekusi, berdasarkan pada tipe objek yang dirujuk
• Operator instanceof
– Menentukan apakah suatu obyek adalah sebuah
instansiasi dari tipe tertentu
Catatan
• Menetapkan (assigning) variabel superkelas ke variabel subkelas (tanpa menggunakan operator cast)
mengakibatkan terjadi kesalahan kompilasi.
• Jika pada waktu eksekusi referensi dari objek subkelas telah di-assign ke sebuah variabel salah satu
superkelas, akan dapat diterima untuk cast variabel referensi superkelas ke referensi subkelas. Sebelum melakukan operasi cast seperti itu, gunakan operator instanceof untuk memastikan bahwa objek tersebut memang sebuah objek dari tipe subkelas yang sesuai.
Catatan
• Ketika downcasting obyek, ClassCastException terjadi, jika pada waktu eksekusi objek tidak memiliki relasi “is-a” dengan tipe yang
ditentukan dalam operator cast. Sebuah objek dapat di-cast hanya untuk tipe-nya sendiri
atau dengan tipe salah satu dari superkelas
nya.
Proses Polimorfisme (
lanjutan)
• Downcasting
– Mengkonversi referensi superkelas ke sebuah referensi subkelas
– Hanya diperbolehkan jika objek memiliki relasi “is-a”
dengan subkelas
• metode getClass
– Diwarisi dari kelas Object
– Mengembalikan (return) sebuah objek dari tipe Class
• Metode getName dari kelas Class
– Mengembalikan (return) dari nama Class
Catatan
• Aturan assignment superclass dan subclass
– Assigning (penugasan) sebuah referensi superkelas ke variabel superkelas secara langsung
– Assigning (penugasan) sebuah referensi subkelas ke variabel subkelas secara langsung
– Assigning (penugasan) sebuah referensi subkelas ke variabel superkelas dibolehkan karena relasi “is-a”
• Referensi pada subclass – hanya anggota melalui variabel superkelas merupakan kesalahan kompilasi
– Assigning (penugasan) referensi superkelas ke variabel subkelas mendatangkan kesalahan kompilasi
• Downcasting bisa mengatasi kesalahan ini
Metode dan Kelas Final
• Metode final
– Tidak dapat di-override di subkelas
– Metode private dan static secara implisit adalah final – Metode final diselesaikan pada waktu kompilasi, ini
disebut sebagai “static binding”
• Compiler dapat mengoptimalkan dengan kode inlining
• Kelas final
– Tidak dapat di-extends oleh subkelas
– Semua metode di kelas final secara implisit final
• Compiler dapat melakukan inline pemanggilan metode final inline dan akan melakukannya
untuk metode final kecil, sederhana. Inlining tidak melanggar prinsip enkapsulasi atau
penyembunyian informasi, tetapi tidak
meningkatkan kinerja karena menghilangkan overhead saat pemanggilan metode.
• Deklarasi subclass sebagai turunan dari kelas
final akan menghasilkan kesalahan kompilasi.
• Dalam Java API, sebagian besar kelas tidak dideklarasikan sebagai final. Hal ini
memungkinkan pewarisan dan polimorfisme – sebagai kapabilitas utama pada pemrograman berorientasi obyek. Namun, dalam beberapa kasus, perlu mendeklarasikan kelas final –
terutama untuk alasan keamanan.
Pembuatan dan Pemanfaatan interfase
• Interface
– Keyword interface
– Hanya berisi konstanta dan metode abstract
• Semua field secara implisit bersifat public, static dan final
• Semua metode secara implisit adalah metode public abstract
– Kelas dapat mengimplementasikan interface
• Kelas harus mendeklarasikan setiap metode dalam interface menggunakan penanda yang sama atau kelas harus dideklarasikan abstract
–Biasanya digunakan ketika kelas berlainan perlu untuk berbagi metode umum dan konstanta
–Biasanya dideklarasikan dalam file mereka sendiri dengan nama yang sama dengan nama interface dengan ekstensi .java.
Catatan
• Deklarasi metode interface tanpa menggunakan
keyword public dan abstract sangat disarankan karena secara implisit atau default sudah demikian sehingga tidak berlebihan dalam deklarasi metode interface .
Demikian pula, konstanta dideklarasikan tanpa keyword public dan static dan final karena akan berlebihan.
• Kegagalan implementasi metode interface pada sebuah kelas yang mengimplementasikan interface tersebut
dan menghasilkan kesalahan sintaks menunjukkan bahwa kelas tersebut harus dideklarasikan abstract.
Contoh Penggunaan interfase
• Interface Pembayaran
– Berisi metode getJumlahPembayaran
– Diimplementasi di kelas Faktur dan kelas Karyawan
• Representasi UML untuk interface
– interface dibedakan dari kelas dengan menempatkan kata "interface" dalam stereotype («dan») diatas nama interface
– Hubungan antara kelas dan interface disebut sebagai realisasi
• Sebuah kelas “realisasi" metode interface
Catatan
• Ketika mendeklarasikan sebuah metode dalam sebuah interface, pilih nama metode yang
menggambarkan tujuan metode tersebut
secara umum, karena metode tersebut dapat
diimplementasikan oleh berbagai kelas yang
tidak berhubungan.
Hirarki Pewarisan Pembayaran
<<interface>>
Pembayaran
<<interface>>
Pembayaran
Faktur
Faktur PegawaiPegawai
PegawaiTetap PegawaiTetap
Contoh Interface
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Contoh Interface ( lanjutan )
Implementasi Interface
• Sebuah kelas dapat mengimplementasikan lebih dari satu interface sesuai kebutuhan
– Gunakan tanda koma untuk memisahkan antar satu interface dengan interface lainnya, tentunya dituliskan setelah keyword implements
– Contoh:
public class NamaKelas extends NamaSuperKelas implements NamaInterface1, NamaInterface2,…
• Obyek setiap subkelas dari kelas yang
mengimplementasikan interface juga dapat dianggap sebagai obyek interface
– Sebuah referensi ke sebuah obyek subkelas dapat ditugaskan (be assigned) ke variabel interface jika superkelas mengimplementasikan interface
tersebut
Implementasi Interface (
lanjutan)
• Pewarisan dan interface serupa dalam implementasinya sebagaimana relasi "is-a". Sebuah objek dari kelas yang
mengimplementasikan interface dapat dianggap sebagai objek bertipe interface. Sebuah objek dari setiap subkelas dari kelas
yang mengimplementasikan interfacejuga dapat dianggap sebagai sebuah objek dari tipe interface.
• Relasi "is-a" hubungan antara superkelas dan subkelas, dan antara interface dan kelas yang mengimplementasikan-nya, berlaku
ketika mengirimkan objek ke metode (sebagai parameter). Ketika parameter metode menerima variabel dari tipe superkelas atau interface, metode memproses objek yang diterima sebagai
argumen polymorphically.
Catatan
• Penggunaan referensi superkelas, polymorphically dapat memanggil metode secara polimorfik yang ditentukan dalam deklarasi superkelas (dan di kelas Object).
Penggunaan referensi interface, dapat memanggil secara polimorfik metode apapun yang ditetapkan dalam
deklarasi interface (dan di kelas Object).
• Semua metode kelas Object dapat dipanggil dengan menggunakan referensi dari tipe interface. Sebuah
referensi mengacu pada suatu objek, dan semua obyek mewarisi metode dari kelas Object.
Catatan
• Interface dapat digunakan untuk mendeklarasikan
konstanta yang digunakan dalam banyak deklarasi kelas.
– Konstanta tersebut secara implisit adalah public, static dan final.
– Gunakan deklarasi import static sehingga memungkinkan penggunaan konstanta tersebut hanya dengan menulis nama konstanta-nya.
• Pada J2SE 5.0, hal di atas dianggap sebagai praktek pemrograman yang lebih baik untuk menciptakan sekumpulan konstanta sebagai enumerasi dengan keyword enum.