BAB 7 OVERLOADING DAN OVERRIDING
Tujuan: Setelah mengikuti matakuliah ini, diharapkan mahasiswa mampu untuk menjelaskan konsep dari overloading dan overriding method, serta mengimplementasikannya dalam Java
7.1. Overloading Overloading adalah suatu keadaan dimana beberapa method sekaligus dapat mempunyai nama yang sama, akan tetapi mempunyai fungsionalitas yang berbeda. Contoh penggunaan overloading dilihat dibawah ini: Gambar(int t1)
1 parameter titik, untuk menggambar titik Gambar(int t1,int t2)
2 parameter titik, untuk menggambar garis Gambar(int t1,int t2,int t3)
3 parameter titik, untuk menggambar segitiga Gambar(int t1,int t2,int t3,int t4)
4 parameter titik, untuk menggambar persegi empat Overloading ini dapat terjadi pada class yang sama atau pada suatu parent class dan subclass-‐nya. Overloading mempunyai ciri-‐ciri sebagai berikut: 1. Nama method harus sama 2. Daftar parameter harus berbeda 3. Return type boleh sama, juga boleh berbeda
import java.awt.Point; public class Segiempat { int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; public void buatSegiempat(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } public void buatSegiempat(Point topLeft, Point bottomRight) { x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; } public void buatSegiempat(Point topLeft, int w, int h) { x1 = topLeft.x; y1 = topLeft.y; x2 = (x1 + w); y2 = (y1 + h); }
void cetakSegiempat(){ System.out.print("Segiempat: <" + x1 + ", " + y1); System.out.println(", " + x2 + ", " + y2 + ">"); } public static void main(String[] arguments) { Segiempat rect = new Segiempat(); System.out.println("Buat segiempat dengan koordinat (25,25) dan (50,50)"); rect.buatSegiempat(25, 25, 50, 50); rect.cetakSegiempat(); System.out.println(); System.out.println("Buat segiempat dengan point (10,10) dan point (20,20):"); rect.buatSegiempat(new Point(10,10), new Point(20,20)); rect.cetakSegiempat(); System.out.println(); System.out.print("Buat segiempat dengan 1 point (10,10), koodinat (50,50)"); rect.buatSegiempat(new Point(10,10), 50, 50); rect.cetakSegiempat(); } }
Ketika program tersebut dijalankan, akan tampak hasil seperti dibawah ini : Buat segiempat dengan koordinat (25,25) dan (50,50) Segiempat: <25, 25, 50, 50> Buat segiempat dengan point (10,10) dan point (20,20): Segiempat: <10, 10, 20, 20> Buat segiempat dengan 1 point (10,10), koodinat (50,50)Segiempat:<10, 10, 60, 60>
7.2. Overriding Overriding adalah suatu keadaan dimana method pada subclass menolak method pada parent class-‐ny. Dalam artian, subklas sebenarnya sudah mewarisi method yang diturunkan dari superklasnya, akantetapi subklas berusaha untuk memodifikasi isi dari method yang sudah diwarisi tersebut dengan operasi atau isi yang lebih spesifik untuknya sendiri. Sebagai contohnya, superklas Hewan mempunyai method bersuara(). Tentu saja ketika ada klas Kucing, Anjing dan Kambing juga mewarisi method bersuara tersebut. Akantetapi di masing-‐masing subklas, method bersuara tersebut dideklarasikan kembali dan isinya dimodifikasi disesuaikan dengan kebutuhan subklas tersebut. Overriding mempunyai ciri-‐ciri sebagai berikut : 1. Nama method harus sama 2. Daftar parameter harus sama 3. Return type harus sama
Berikut ini contoh terjadinya overriding dimana method info() pada class Child meng-‐override method info() pada class parent: class Parent { public void info() { System.out.println(“Ini class Parent”); } } class Child extends Parent { public void Info() { System.out.println(“Ini class Child”); } }
Contoh yang lain class Hewan { public String bersuara() { return “suara hewan”; } } class Anjing extends Hewan { public String bersuara() { return “hug..hug..”; } } class Kucing extends Hewan { public String bersuara() { return “miaw..miaw..”; } } class Kambing extends Hewan { public String bersuara() { return “mbek..mbek..”; } }
Dari beberapa contoh di atas terlihat bahwa di subklas, dideklarasikan kembali method yang sebenarnya sudah diwarisi dari superklas, akantetapi dengan isi yang berbeda dengan isi method yang dimiliki oleh superklas. Method yang terkena override y a i t u y a n g a d a d i d a l a m s u p e r k l a s (overridden method) diharuskan tidak boleh mempunyai
modifier
yang lebih luas aksesnya dari method yang meng-‐override yaitu yang di subklas (overriding method).
Perhatikan gambar diagram klas berikut ini Pegawai +nip: String +nama: String +gaji: int +hitungGaji(): int
Dosen +tunjangan: int +hitungGaji(): int
Staff +hitungGaji(): int
Dari diagram klas tersebut dibuat program dengan langkah sebagai berikut: 1. Buka kembali project MyApp 2. Buat paket baru dengan nama latihan5 3. Di dalam paket latihan5 buat klas Pegawai, Dosen dan Staff serta Main 4. Lengkapi klas Pegawai sebagai berikut package latihan5; public class Pegawai { public String nip, nama; public int gaji; public int hitungGaji(){ return gaji; } }
5. Lengkapi klas Dosen sebagai berikut package latihan5; public class Dosen extends Pegawai{ public int tunjangan; @Override public int hitungGaji(){ return (int) (gaji + tunjangan - 0.15 * (gaji + tunjangan)); } }
6. Lengkapi klas Staff sebagai berikut package latihan5;
public class Staff extends Pegawai{ @Override public int hitungGaji(){ float bonus = 0.2f*gaji; return (int) (gaji + bonus - 0.10 * (gaji + bonus)); } }
7. Kemudian lengkapi klas Main package latihan5; public class Main { public static void main(String[] arvg){ Dosen d = new Dosen(); d.nip = "1942191"; d.nama = "imam"; d.gaji = 2000000; d.tunjangan = 200000; System.out.println("Gaji total dosen "+d.nama+" = "+d.hitungGaji()); Staff s = new Staff(); s.nip = "62555"; s.nama = "rozi"; s.gaji = 1500000; System.out.println("Gaji total Staff "+s.nama+" = "+s.hitungGaji()); } }
8. Jlankan klas Main dan akan muncul hasil sebagai berikut run: Gaji total dosen imam = 1870000 Gaji total Staff rozi = 1620000 BUILD SUCCESSFUL (total time: 1 second)
9. Dari hasil yang muncl, terlihat bahwa ketika dipanggil method hitungGaji ()
dari objek d dan s yang dijalankan adalah method
hitungGaji ()
yang ada di dalam klas Dosen dan Staff, bukan method
hitungGaji ()
yang ada di superklasnya atau klas Pegawai.
BAB 8 POLIMORFISME Tujuan: Setelah menempuh matakuliah ini, diharapkan mahasiswa mampu mengerti konsep dan implementasi dalam Java terkait dengan: 1. Polimorfisme 2. Virrtual Methid Invocation 3. Polymorphic Arguments 4. Pernyataan Instance Of 5. Casting Object
8.1. Polimorfisme Polymorphism
(polimorfisme)
adalah kemampuan
untuk
mempunyai beberapa bentuk class yang berbeda. Polimorfisme ini terjadi pada saat suatu obyek bertipe parent class, akan tetapi pemanggilan constructornya melalui subclass. Misalnya deklarasi pernyataan berikut ini: Employee employee=new Manager();
dimana Manager() adalah kontruktor pada class Manager yang merupakan subclass dari class Employee.
8.2. Virtual Method Invocation Virtual Method Invocation (VMI) bisa terjadi jika terjadi polimorfisme dan overriding. Pada saat obyek yang sudah dibuat tersebut memanggil overridden method pada parent class, kompiler Java akan melakukan invocation (pemanggilan) terhadap overriding method pada subclass, dimana yang seharusnya dipanggil adalah overridden method. Berikut contoh terjadinya VMI: class Parent { int x = 5; public void Info() { System.out.println(“Ini class Parent”); } } class Child extends Parent { int x = 10; public void Info() { System.out.println(“Ini class Child”); } } public class Tes { public static void main(String args[]) { Parent tes=new Child(); System.out.println(“Nilai x = “ + tes.x); tes.Info(); } }
Hasil dari running program diatas adalah sebagai berikut: Nilai x = 5 Ini class Child
Dari hasil di atas terlihat bahwa ketika diakses atribut x dari objek tes, maka yang muncul adalah nilai x dari superklas, bukan atribut x dari subklas. Akantetapi ketika diakses method Info () dari objek tes, yang muncul adalah method Info() dari subklas, bukan method Info() dari superklas.
8.3. Polymorphic Arguments Polymorphic arguments adalah tipe suatu parameter yang menerima suatu nilai yang bertipe subclass-‐nya. Berikut contoh dari polymorphics arguments: class Pegawai { … } class Manajer extends Pegawai { … } public class Tes { public static void Proses(Pegawai peg) { … } public static void main(String args[]) { Manajer man = new Manajer(); Proses(man); } }
8.4. Instance Of Pernyataan instanceof sangat berguna untuk mengetahui tipe asal dari suatu polymorphic arguments. Untuk lebih jelasnya, misalnya dari contoh program sebelumnya, kita sedikit membuat modifikasi pada class Tes dan ditambah sebuah class baru Kurir, seperti yang tampak dibawah ini:
… class Kurir extends Pegawai { … }
public class Tes { public static void Proses(Pegawai peg) { if (peg instanceof Manajer) { …lakukan tugas-tugas manajer… } else if (peg instanceof Kurir) { …lakukan tugas-tugas kurir… } else { …lakukan tugas-tugas lainnya… } } public static void main(String args[]) { Manajer man = new Manajer(); Kurir kur = new Kurir(); Proses(man); Proses(kur); } }
8.5. Casting Objects
Seringkali pemakaian instanceof diikuti dengan casting object dari
tipe parameter ke tipe asal. Misalkan saja program kita sebelumnya. Pada saat kita sudah melakukan instanceof dari tipe Manajer, kita dapat melakukan casting object ke tipe asalnya, yaitu Manajer. Caranya adalah seperti berikut: … if (peg instanceof Manajer) { Manajer man = (Manajer) peg; …lakukan tugas-tugas manajer… } …
Dari diagram klas yang digunakan contoh dalam penbahasan inheritance, kita gunakan lagi sebagai conth dalam bab ini. Diagram klasnya seperti tampil dalam gambar di bawah ini: Pegawai +nip: String +nama: String +gaji: int +hitungGaji(): int
Dosen +tunjangan: int +hitungGaji(): int
Staff +hitungGaji(): int
Langkah untuk simulasinya adalah sebagai berikut: 1. Buka kembali project MyOop 2. Buat paket latihan6 3. Copy klas Pegawai, Dosen dan Staff dari paket latihan5, kemudian paste ke dalam paket latihan6. 4. Modifikasi klas Dosen sebagai berikut package latihan6; public class Dosen extends Pegawai{ public int tunjangan; public int gajiNgajar; @Override public int hitungGaji(){ return (int) (gaji + tunjangan - 0.15 * (gaji + tunjangan)); } public int getGajiNgajar(){ return gajiNgajar; } }
5. Modifikasi klas Staff package latihan6; public class Staff extends Pegawai{ public int gajiLembur;
@Override public int hitungGaji(){ float bonus = 0.2f*gaji; return (int) (gaji + bonus - 0.10 * (gaji + bonus)); } public int getGajiLembur() { return gajiLembur; } }
6. Dalam paket latihan6, buat klas Main dan isikan kode program seperti di bawah ini package latihan6; public class Main { public static int ambilGaji(Pegawai peg) {//polimorfic argument //virtual method invocation int gaji = peg.hitungGaji(); if (peg instanceof Dosen) { Dosen d = (Dosen) peg;//casting objek gaji += d.getGajiNgajar(); } else if (peg instanceof Staff) { Staff s = (Staff) peg; gaji += s.getGajiLembur(); } return gaji; } public static void main(String args[]) { Dosen d = new Dosen(); d.nip = "1942191"; d.nama = "imam"; d.gaji = 2000000; d.tunjangan = 200000; d.gajiNgajar = 500000; System.out.println("Gaji total dosen "+d.nama+" = "+ambilGaji(d)); Staff s = new Staff(); s.nip = "62555"; s.nama = "rozi"; s.gaji = 1500000; s.gajiLembur = 500000; System.out.println("Gaji total Staff "+s.nama+" = "+ambilGaji(s)); } }
7. Jalankan klas Main dan hasilnya akan keluar sebagai berikut run: Gaji total dosen imam = 2370000 Gaji total Staff rozi = 2120000 BUILD SUCCESSFUL (total time: 0 seconds)