8 Fitur Oo Lanjutan (B)

743 views

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
743
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
30
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

8 Fitur Oo Lanjutan (B)

  1. 1. Fitur OO Lanjutan Java (samb) Sufian Idris Marini Abu Bakar Jabatan Sains Komputer
  2. 2. Pengenalan <ul><li>Tajuk berikut akan dibincangkan: </li></ul><ul><ul><li>Metod pembina </li></ul></ul><ul><ul><li>Penyaratan metod </li></ul></ul><ul><ul><li>Kawalan capaian </li></ul></ul><ul><ul><li>Hubungan pewarisan </li></ul></ul><ul><ul><li>Pensubkelasan </li></ul></ul><ul><ul><li>Pembatalan metod </li></ul></ul><ul><ul><li>Polimorfisma </li></ul></ul>
  3. 3. Pensubkelasan <ul><li>Java menyokong hubungan pewarisan menerusi pensubkelasan . Dengan menakrifkan suatu kelas sebagai subkelas suatu kelas lain, maka wujudlah hubungan pewarisan di antara kedua-dua kelas tersebut. </li></ul><ul><li>Dalam Java, suatu kelas ditakrifkan sebagai subkelas suatu kelas lain dengan menggunakan kata kunci extends . Sebagai contoh.. </li></ul>
  4. 4. class SegiempatSama extends Segiempat { } class Segiempat { } <ul><li>public Segiempat(int lbr, int tgg) { </li></ul><ul><ul><li>lebar = lbr; </li></ul></ul><ul><ul><li>tinggi = tgg; </li></ul></ul><ul><li>} </li></ul><ul><li>public int luas() { </li></ul><ul><ul><li>return lebar * tinggi; </li></ul></ul><ul><li>} </li></ul>private int lebar, tinggi; Kelas induk subkelas
  5. 5. <ul><li>Di sini kelas SegiempatSama ditakrifkan sebagai suatu subkelas bagi kelas Segiempat . </li></ul><ul><li>Setiap subkelas mewarisi atribut dan metod ahli kelas induknya. </li></ul><ul><li>Perlu ditekankan bahawa subkelas TIDAK mewarisi metod pembina serta metod private kelas induk. </li></ul><ul><li>Selain daripada atribut dan metod yang diwarisi daripada kelas induk, subkelas juga mempunyai atribut dan metod yang khusus untuknya. </li></ul><ul><ul><li>Contoh... </li></ul></ul>
  6. 6. class JamAnalog { private int minit, jam, saat ; public JamAnalog() {…} public void papar() {…} private void paparMuka() {…} private void paparTangan() {…} } class JamTangan extends JamAnalog { private int ukurlilit ; public JamTangan() {…} } : JamTangan Atribut: Metod pembina: Metod ahli: minit, jam, saat ukurlilit JamTangan() papar()
  7. 7. <ul><li>Metod Pembina dan super </li></ul><ul><li>Atribut private dalam kelas induk tidak boleh dicapai secara langsung oleh subkelas walaupun atribut tersebut diwarisi. Bagaimana untuk meng awal kan atribut tersebut dalam metod pembina subkelas? </li></ul><ul><li>Setiap metod pembina subkelas diwajibkan memanggil mana-mana metod pembina kelas induknya. Ini dilakukan menerusi pernyataan super(). </li></ul><ul><li>Pernyataan super() mestilah pernyataan pertama dalam metod pembina. </li></ul>
  8. 8. <ul><li>Contoh: </li></ul>class Segiempat { } <ul><li>public Segiempat(int lbr, int tgg) { </li></ul><ul><ul><li>lebar = lbr; </li></ul></ul><ul><ul><li>tinggi = tgg; </li></ul></ul><ul><li>} </li></ul><ul><li>public int luas() { </li></ul><ul><ul><li>return lebar * tinggi; </li></ul></ul><ul><li>} </li></ul>private int lebar, tinggi; class SegiempatSama extends Segiempat { } <ul><li>public SegiempatSama(int saiz) { </li></ul><ul><ul><li>super(saiz, saiz); </li></ul></ul><ul><li>} </li></ul>Mewarisi metod pembina kelas Segiempat
  9. 9. <ul><li>Jika suatu metod pembina tidak diletakkan sebarang pernyataan super() maka pengkompil akan selitkan satu pernyataan super() yang tidak berparameter dalam metod tersebut. </li></ul>
  10. 10. <ul><li>Contoh: </li></ul><ul><ul><ul><li>Mesej ralat berikut dipaparkan. Mengapa ? </li></ul></ul></ul><ul><ul><ul><li>test.java: 16: cannot resolve symbol </li></ul></ul></ul><ul><ul><ul><li>symbol : constructor Segiempat () </li></ul></ul></ul><ul><ul><ul><li>location: class Segiempat </li></ul></ul></ul><ul><ul><ul><li>public SegiempatSama(int saiz) { </li></ul></ul></ul><ul><ul><li> ^ </li></ul></ul>class SegiempatSama extends Segiempat { } <ul><li>public SegiempatSama(int saiz) { </li></ul><ul><ul><li>setLebar(saiz); </li></ul></ul><ul><ul><li>setTinggi(saiz); </li></ul></ul><ul><li>} </li></ul>class Segiempat { } <ul><li>public Segiempat(int lbr, int tgg) { </li></ul><ul><ul><li>lebar = lbr; </li></ul></ul><ul><ul><li>tinggi = tgg; </li></ul></ul><ul><li>} </li></ul><ul><li>public void setTinggi(int tgg) { </li></ul><ul><ul><li>tinggi = tgg; </li></ul></ul><ul><li>} </li></ul>private int lebar, tinggi; <ul><li>public void setLebar(int lbr) { </li></ul><ul><ul><li>lebar = lbr; </li></ul></ul><ul><li>} </li></ul>Pengkompil selitkan pernyataan super()
  11. 11. <ul><li>Kelebihan Pewarisan </li></ul><ul><li>Mengurangkan kod berlebihan dan pengubahsuaian kod </li></ul><ul><ul><li>Kelas induk menempatkan atribut dan perlakuan yang akan diwarisi oleh semua kelas keturunannya. Kesepunyaan kod boleh membawa kepada pengurangan pengubahsuaian kod. </li></ul></ul><ul><li>Memudahkan perluasan kod aturcara </li></ul><ul><ul><li>Misalnya, untuk menambah satu subkelas baru, kita tuliskan kod (takrifan kelas) yang membezakan subkelas itu daripada kelas induknya. </li></ul></ul>
  12. 12. <ul><li>Meningkatkan guna semula kod </li></ul><ul><ul><li>Misalnya, kita boleh takrifkan suatu subkelas bagi suatu kelas dalam suatu pustaka. Sebagai contoh, kita boleh takrifkan suatu subkelas di bawah kelas Button dalam pustaka Java untuk mewakili suatu butang yang istimewa. </li></ul></ul><ul><ul><li>Dalam subkelas itu, kita boleh masukkan perlakuan tambahan yang khusus untuk butang tersebut (walau pun kita tidak mempunyai kod sumber kelas Button ). </li></ul></ul>
  13. 13. Pembatalan Metod <ul><li>Ada kalanya, terdapat perlakuan yang diwarisi oleh subkelas yang kurang atau tidak sesuai untuk kelas tersebut. </li></ul><ul><ul><li>Sebagai contoh... </li></ul></ul>
  14. 14. Kelas Titik mewarisi atribut jejari dan metod luas() daripada kelas induk Bulatan class Bulatan { } <ul><li>public Bulatan(int j) { </li></ul><ul><ul><li>jejari = j; </li></ul></ul><ul><li>} </li></ul>private int jejari; <ul><li>public float luas( ) { </li></ul><ul><ul><li>System.out.print(&quot;(Dalam metod luas() bagi kelas Bulatan) &quot;); </li></ul></ul><ul><ul><li>return 22.0/7*jejari*jejari; </li></ul></ul><ul><li>} </li></ul>class Titik extends Bulatan { } <ul><li>public Titik(int nx, int ny) { </li></ul><ul><ul><li>super(0); </li></ul></ul><ul><ul><li>x = nx; </li></ul></ul><ul><ul><li>y = ny; </li></ul></ul><ul><li>} </li></ul>private int x, y;
  15. 15. <ul><li>Setiap objek Titik mempunyai luas 0; tidak perlu guna rumus luas bulatan untuk mendapatkan luasnya. </li></ul><ul><li>Output: </li></ul><ul><ul><li>Luas bulatan: (Dalam metod luas() bagi kelas Bulatan) 154.0 </li></ul></ul><ul><ul><li>Luas titik: (Dalam metod luas() bagi kelas Bulatan) 0.0 </li></ul></ul>class Aplikasi { } <ul><li>public static void main(String[ ] args) { </li></ul><ul><ul><li>Bulatan bulatan = new Bulatan(7); </li></ul></ul><ul><ul><li>Titik titik = new Titik(100, 50); </li></ul></ul><ul><ul><li>System.out.println(&quot;Luas bulatan: &quot;+bulatan.luas()); </li></ul></ul><ul><ul><li>System.out.println(&quot;Luas titik: &quot;+titik.luas()); </li></ul></ul><ul><li>} </li></ul>
  16. 16. <ul><li>Java mempunyai fitur pembatalan metod . Pembatalan metod bermaksud menggantikan pengimplementasian suatu metod yang diwarisi daripada kelas induk dengan suatu pengimplementasian lain. </li></ul><ul><li>Untuk membatalkan suatu metod, kita cuma takrifkan semula metod tersebut dalam subkelas yang berkenaan.. </li></ul><ul><ul><li>Contoh.. </li></ul></ul>
  17. 17. Terus kembalikan nilai 0 untuk luas Titik class Titik extends Bulatan { } <ul><li>public Titik(int nx, int ny) { </li></ul><ul><ul><li>super(0); </li></ul></ul><ul><ul><li>x = nx; </li></ul></ul><ul><ul><li>y = ny; </li></ul></ul><ul><li>} </li></ul>private int x, y; <ul><li>public float luas( ) { </li></ul><ul><ul><li>System.out.print(&quot;(Dalam metod luas() bagi kelas Titik) &quot;); </li></ul></ul><ul><ul><li>return 0; </li></ul></ul><ul><li>} </li></ul>class Bulatan { } <ul><li>public Bulatan(int j) { </li></ul><ul><ul><li>jejari = j; </li></ul></ul><ul><li>} </li></ul>private int jejari; <ul><li>public float luas( ) { </li></ul><ul><ul><li>System.out.print(&quot;(Dalam metod luas() bagi kelas Bulatan) &quot;); </li></ul></ul><ul><ul><li>return 22.0/7*jejari*jejari; </li></ul></ul><ul><li>} </li></ul>Pembatalan metod luas()
  18. 18. <ul><li>Output: </li></ul><ul><ul><li>Luas bulatan: (Dalam metod luas() bagi kelas Bulatan) 154.0 </li></ul></ul><ul><ul><li>Luas titik: (Dalam metod luas() bagi kelas Titik) 0.0 </li></ul></ul>class Aplikasi { } <ul><li>public static void main(String[ ] args) { </li></ul><ul><ul><li>Bulatan bulatan = new Bulatan(7); </li></ul></ul><ul><ul><li>Titik titik = new Titik(100, 50); </li></ul></ul><ul><ul><li>System.out.println(&quot;Luas bulatan: &quot;+bulatan.luas()); </li></ul></ul><ul><ul><li>System.out.println(&quot;Luas titik: &quot;+titik.luas()); </li></ul></ul><ul><li>} </li></ul>
  19. 19. <ul><li>Rajah berikut menggambarkan proses yang terlibat dalam menentukan metod yang akan dilaksanakan apabila objek daripada E , D dan B dihantar mesej buatIni() . </li></ul>D objD = new D(); E objE = new E(); B objB = new B(); objE.buatIni(); objD.buatIni(); objB.buatIni();
  20. 20. <ul><li>Mengenai super lagi… </li></ul><ul><li>Pertimbangkan segmen kod di bawah: </li></ul>Contoh: Perhatikan kelas Segiempat ini.. class Segiempat { … … } <ul><li>public void papar( ) { </li></ul><ul><ul><li>for (int baris=0; baris < tinggi; baris++) { </li></ul></ul><ul><ul><ul><li>for (int lajur=0; lajur < lebar; lajur++) </li></ul></ul></ul><ul><ul><ul><ul><li>System.out.print('*'); </li></ul></ul></ul></ul><ul><ul><ul><li>System.out.println(); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  21. 21. <ul><li>class SegiempatBerlabel extends Segiempat { </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public SegiempatBerlabel(int lbr, int tgg, String lb) { </li></ul><ul><ul><li>super(lebar, tinggi); </li></ul></ul><ul><ul><li>label = lb; </li></ul></ul><ul><li>} </li></ul>private String label; <ul><li>public void papar( ) { </li></ul><ul><ul><li>System.out.println(&quot;=================&quot;); </li></ul></ul><ul><ul><li>for (int baris=0; baris < tinggi; baris++) { </li></ul></ul><ul><ul><ul><li>for (int lajur=0; lajur < lebar; lajur++) </li></ul></ul></ul><ul><ul><ul><ul><li>System.out.print('*'); </li></ul></ul></ul></ul><ul><ul><ul><li>System.out.println(); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>System.out.println(label); </li></ul></ul><ul><ul><li>System.out.println(&quot;=================&quot;); </li></ul></ul><ul><li>} </li></ul>sama dengan kod pada metod papar() dalam kelas Segiempat Pembatalan metod Mewarisi kelas Segiempat
  22. 22. <ul><li>Bolehkah kita mengguna semula metod papar () yang telah dibatalkan? </li></ul>class Aplikasi { } <ul><li>public static void main(String[ ] args) { </li></ul><ul><ul><li>Segiempat segi4 = new Segiempat(4, 3); </li></ul></ul><ul><ul><li>SegiempatBerlabel segi4x; </li></ul></ul><ul><ul><li>segi4x = new SegiempatBerlabel(8, 3, &quot;Blok&quot;); </li></ul></ul><ul><ul><li>segi4.papar(); </li></ul></ul><ul><ul><li>System.out.println(); </li></ul></ul><ul><ul><li>segi4x.papar(); </li></ul></ul><ul><li>} </li></ul>
  23. 23. <ul><li>Kita boleh gunakan kata kunci super untuk melaksanakan suatu metod yang telah dibatalkan oleh subkelas </li></ul>Melaksana metod yang telah dibatalkan <ul><li>class SegiempatBerlabel extends Segiempat { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public void papar( ) { </li></ul><ul><ul><li>System.out.println(&quot;=================&quot;); </li></ul></ul><ul><ul><li>super.papar(); </li></ul></ul><ul><ul><li>System.out.println(label); </li></ul></ul><ul><ul><li>System.out.println(&quot;=================&quot;); </li></ul></ul><ul><li>} </li></ul>
  24. 24. <ul><li>Kawalan Capaian protected </li></ul><ul><li>Kawalan capaian protected membolehkan suatu atribut atau metod dicapai oleh </li></ul><ul><ul><li>semua subkelas di bawahnya. </li></ul></ul><ul><ul><li>semua kelas yang se pakej dengannya. (Pakej akan dibincangkan kemudian. Buat masa ini, kelas yang anda takrifkan dimasukkan dalam suatu pakej lalai ( default package )) </li></ul></ul><ul><li>Atribut dan metod protected yang ditakrifkan bersifat seperti atribut dan metod public dalam skop capaiannya . </li></ul>
  25. 25. Polimorfisma <ul><li>Java menyokong polimorfisma. Polimorfisma bermaksud </li></ul><ul><ul><ul><li>&quot;satu mesej, pelbagai metod&quot; </li></ul></ul></ul><ul><ul><li>Penggunaan polimorfisma boleh memudahkan penyenggaraan dan perluasan atur cara. </li></ul></ul><ul><ul><li>Contoh... </li></ul></ul>
  26. 26. Gerak !
  27. 27. <ul><li>Pertimbangkan hirarki kelas Bentuk di bawah: </li></ul>class SegiempatSama extends Segiempat { … } Kelas Bentuk menakrifkan metod papar() Kelas Segiempat membatalkan metod papar() <ul><li>class Bentuk { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul>public void papar( ) { } <ul><li>class Segiempat extends Bentuk { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public void papar( ) { </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul>
  28. 28. class SegitigaSama extends Segitiga { … } class SegitigaTepat extends Segitiga { … } Kelas Segitiga juga membatalkan metod papar() Kelas Segilima juga membatalkan metod papar() <ul><li>class Segitiga extends Bentuk { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public void papar( ) { </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>class Segilima extends Bentuk { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public void papar( ) { </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul>
  29. 29. <ul><li>Pertimbangkan pula kod berikut yang mengaplikasikan polimorfisma . </li></ul><ul><li>Tidak perlu uji jenis bentuk untuk tentukan metod papar() yang ingin dilaksanakan </li></ul><ul><li>Kod aturcara menjadi ringkas </li></ul>class Aplikasi { } <ul><li>public static void main(String[ ] args) { </li></ul><ul><ul><li>Bentuk bentuk[] = new Bentuk[50]; </li></ul></ul><ul><ul><li>bentuk[0] = new SegiempatSama(...); </li></ul></ul><ul><ul><li>bentuk[1] = new SegitigaTepat(...); </li></ul></ul><ul><ul><li>bentuk[2] = new Segilima(...); </li></ul></ul><ul><ul><li>for (int i=0; i < 3; i++) </li></ul></ul><ul><ul><ul><li>bentuk[i].papar(); </li></ul></ul></ul><ul><li>} </li></ul>POLIMORFISMA perlaksanaan metod papar() ditafsirkan secara automatik
  30. 30. <ul><li>Berdasarkan kepada konsep boleh tukarganti ( substitutability ), tatasusunan berjenis Bentuk boleh menyimpan rujukan kepada mana-mana objek daripada kelas keturunan Bentuk . </li></ul><ul><li>Metod papar( ) yang dilaksanakan oleh pernyataan bentuk[i].papar() akan ditentukan oleh jenis sebenar objek yang dirujuk oleh bentuk[i] </li></ul><ul><ul><li>Contoh.. </li></ul></ul>
  31. 31. btk : Segiempat : SegiempatSama : Segilima : SegitigaSama : SegiempatSama class Segiempat { … public void papar( ) { … } … } class Segilima { … public void papar( ) { … } … } class Segitiga { … public void papar( ) { … } … } papar() papar() papar() papar() papar()
  32. 32. <ul><li>Bagaimana jika kita ingin menambah bentuk segienam? </li></ul><ul><li>class Segienam extends Bentuk { </li></ul><ul><li>… </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul><ul><li>public void papar( ) { </li></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul>
  33. 33. <ul><li>Kita cuma tambah kelas untuk bentuk segienam. </li></ul><ul><li>Dengan adanya sokongan polimorfisma, badan gelung for dalam metod main () tadi TIDAK perlu diubah. Begitu juga pada tempat lain dalam aturcara yang bergantung kepada jenis bentuk. </li></ul><ul><li>Lihat contoh: KlinikHaiwan.java dan KlinikMoo.java </li></ul>
  34. 34. Haiwan Peliharaan String nama boolean lapar HaiwanPeliharaan(Sring namanya) void perkenalDiri() void makan() String getNama() String keluarBunyi() Kucing Kucing(String nama) void perkenalDiri() String keluarBunyi() Gajah Gajah(String nama) String keluarBunyi()
  35. 35. class HaiwanPeliharaan { ...... } <ul><ul><li>private String nama; </li></ul></ul><ul><ul><li>private boolean lapar; </li></ul></ul>public void perkenalkanDiri() { System.out.print(nama); if (lapar) System.out.print(&quot; (lapar)&quot;); else System.out.print(&quot; (kenyang)&quot;); System.out.println(); } <ul><ul><li>public HaiwanPeliharaan(String namanya) { </li></ul></ul><ul><li>nama = namanya; </li></ul><ul><li>lapar = true; </li></ul><ul><li>} </li></ul>public void makan() { System.out.println(nama+&quot;: Terima kasih! Mmmm...&quot;+keluarBunyi()); lapar = false; }
  36. 36. class KlinikHaiwan { ...... } <ul><ul><li>private HaiwanPeliharaan[] lot; </li></ul></ul><ul><li>public void senaraiHaiwan() { </li></ul><ul><ul><li>for (int i=0; i < lot.length; i++) </li></ul></ul><ul><li>if (!lotKosong(i)) </li></ul><ul><ul><ul><li>lot[i].perkenalkanDiri(); </li></ul></ul></ul><ul><li>} </li></ul><ul><li>public KlinikHaiwan(int bilanganLot) { </li></ul><ul><ul><li>lot = new HaiwanPeliharaan[bilanganLot]; </li></ul></ul><ul><ul><li>for (int i=0; i < bilanganLot; i++) </li></ul></ul><ul><li>lot[i] = null; </li></ul><ul><li>} </li></ul><ul><li>public void waktuMakan() { </li></ul><ul><ul><li>System.out.println(&quot;================&quot;); </li></ul></ul><ul><ul><li>System.out.println(&quot;WAKTU MAKAN!!!!!&quot;); </li></ul></ul><ul><ul><li>System.out.println(&quot;================&quot;); </li></ul></ul><ul><ul><li>for (int i=0; i < lot.length; i++) </li></ul></ul><ul><li>if (!lotKosong(i)) </li></ul><ul><ul><li> lot[i].makan(); </li></ul></ul><ul><li>} </li></ul>POLIMORFISMA
  37. 37. class KlinikMoo { } <ul><li>public static void main(String[] args) { </li></ul><ul><ul><li>KlinikHaiwan klinikMoo = new KlinikHaiwan(30); </li></ul></ul><ul><li>klinikMoo.daftar(new Kucing(&quot;Along&quot;)); </li></ul><ul><ul><li>klinikMoo.daftar(new Kucing(&quot;Rambo&quot;)); </li></ul></ul><ul><ul><li>klinikMoo.waktuMakan(); </li></ul></ul><ul><ul><li>klinikMoo.daftar(new Kucing(&quot;KiKi&quot;)); </li></ul></ul><ul><ul><li>klinikMoo.daftar(new Gajah(&quot;Jumbo&quot;)); </li></ul></ul><ul><ul><li>klinikMoo.waktuMakan(); </li></ul></ul><ul><ul><li>klinikMoo.senaraiHaiwan(); </li></ul></ul><ul><ul><li>} </li></ul></ul>Kompil dan laksanakan aturcara ini. Fahamkan outputnya

×