8 fitur oo lanjutan (b)

37
Fitur OO Lanjutan Java (samb) Sufian Idris Marini Abu Bakar Jabatan Sains Komputer

Upload: madzani-nusa

Post on 23-Jun-2015

523 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: 8   Fitur Oo Lanjutan (B)

Fitur OO Lanjutan Java(samb)

Sufian IdrisMarini Abu Bakar

Jabatan Sains Komputer

Page 2: 8   Fitur Oo Lanjutan (B)

Pengenalan

• Tajuk berikut akan dibincangkan:– Metod pembina– Penyaratan metod– Kawalan capaian– Hubungan pewarisan– Pensubkelasan– Pembatalan metod– Polimorfisma

Page 3: 8   Fitur Oo Lanjutan (B)

Pensubkelasan

• 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.

• Dalam Java, suatu kelas ditakrifkan sebagai subkelas suatu kelas lain dengan menggunakan kata kunci extends. Sebagai contoh..

Page 4: 8   Fitur Oo Lanjutan (B)

class SegiempatSama extends Segiempat {

}

class Segiempat {

}

public Segiempat(int lbr, int tgg) {lebar = lbr;tinggi = tgg;

}

public int luas() {return lebar * tinggi;

}

private int lebar, tinggi;

Kelas induksubkelas

Page 5: 8   Fitur Oo Lanjutan (B)

• Di sini kelas SegiempatSama ditakrifkan sebagai suatu subkelas bagi kelas Segiempat.

• Setiap subkelas mewarisi atribut dan metod ahli kelas induknya.

• Perlu ditekankan bahawa subkelas TIDAK mewarisi metod pembina serta metod private kelas induk.

• Selain daripada atribut dan metod yang diwarisi daripada kelas induk, subkelas juga mempunyai atribut dan metod yang khusus untuknya. – Contoh...

Page 6: 8   Fitur Oo Lanjutan (B)

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, saatukurlilit

JamTangan()

papar()

Page 7: 8   Fitur Oo Lanjutan (B)

Metod Pembina dan super• Atribut private dalam kelas induk tidak

boleh dicapai secara langsung oleh subkelas walaupun atribut tersebut diwarisi. Bagaimana untuk mengawalkan atribut tersebut dalam metod pembina subkelas?

• Setiap metod pembina subkelas diwajibkan memanggil mana-mana metod pembina kelas induknya. Ini dilakukan menerusi pernyataan super().

• Pernyataan super() mestilah pernyataan pertama dalam metod pembina.

Page 8: 8   Fitur Oo Lanjutan (B)

• Contoh:

class Segiempat {

}

public Segiempat(int lbr, int tgg) {lebar = lbr;tinggi = tgg;

}

public int luas() {return lebar * tinggi;

}

private int lebar, tinggi;

class SegiempatSama extends Segiempat {

}

public SegiempatSama(int saiz) {super(saiz, saiz);

}

Mewarisi metod pembina kelas Segiempat

Page 9: 8   Fitur Oo Lanjutan (B)

• Jika suatu metod pembina tidak diletakkan sebarang pernyataan super() maka pengkompil akan selitkan satu pernyataan super() yang tidak berparameter dalam metod tersebut.

Page 10: 8   Fitur Oo Lanjutan (B)

• Contoh:

class SegiempatSama extends Segiempat {

}

public SegiempatSama(int saiz) {setLebar(saiz);setTinggi(saiz);

}

class Segiempat {

}

public Segiempat(int lbr, int tgg) {lebar = lbr;tinggi = tgg;

}

public void setTinggi(int tgg) {tinggi = tgg;

}

private int lebar, tinggi;

public void setLebar(int lbr) {lebar = lbr;

}Pengkompil selitkan pernyataan super()

Mesej ralat berikut dipaparkan. Mengapa? test.java: 16: cannot resolve symbol symbol : constructor Segiempat () location: class Segiempat public SegiempatSama(int saiz) {

^

Page 11: 8   Fitur Oo Lanjutan (B)

Kelebihan Pewarisan

• Mengurangkan kod berlebihan dan pengubahsuaian kod– Kelas induk menempatkan atribut dan

perlakuan yang akan diwarisi oleh semua kelas keturunannya. Kesepunyaan kod boleh membawa kepada pengurangan pengubahsuaian kod.

• Memudahkan perluasan kod aturcara– Misalnya, untuk menambah satu subkelas

baru, kita tuliskan kod (takrifan kelas) yang membezakan subkelas itu daripada kelas induknya.

Page 12: 8   Fitur Oo Lanjutan (B)

• Meningkatkan guna semula kod– 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.

– Dalam subkelas itu, kita boleh masukkan perlakuan tambahan yang khusus untuk butang tersebut (walau pun kita tidak mempunyai kod sumber kelas Button).

Page 13: 8   Fitur Oo Lanjutan (B)

Pembatalan Metod

• Ada kalanya, terdapat perlakuan yang diwarisi oleh subkelas yang kurang atau tidak sesuai untuk kelas tersebut. – Sebagai contoh...

Page 14: 8   Fitur Oo Lanjutan (B)

class Bulatan {

}

public Bulatan(int j) {jejari = j;

}

private int jejari;

public float luas( ) {System.out.print("(Dalam metod luas() bagi kelas Bulatan) ");return 22.0/7*jejari*jejari;

}

class Titik extends Bulatan {

}

public Titik(int nx, int ny) {super(0);x = nx;y = ny;

}

private int x, y; Kelas Titik mewarisi atribut jejari dan metod luas() daripada kelas induk Bulatan

Page 15: 8   Fitur Oo Lanjutan (B)

• Setiap objek Titik mempunyai luas 0; tidak perlu guna rumus luas bulatan untuk mendapatkan luasnya.

class Aplikasi {

}

public static void main(String[ ] args) {Bulatan bulatan = new Bulatan(7);Titik titik = new Titik(100, 50);System.out.println("Luas bulatan: "+bulatan.luas());System.out.println("Luas titik: "+titik.luas());

}

Output:Luas bulatan: (Dalam metod luas() bagi kelas Bulatan) 154.0Luas titik: (Dalam metod luas() bagi kelas Bulatan) 0.0

Page 16: 8   Fitur Oo Lanjutan (B)

• Java mempunyai fitur pembatalan metod. Pembatalan metod bermaksud menggantikan pengimplementasian suatu metod yang diwarisi daripada kelas induk dengan suatu pengimplementasian lain.

• Untuk membatalkan suatu metod, kita cuma takrifkan semula metod tersebut dalam subkelas yang berkenaan..– Contoh..

Page 17: 8   Fitur Oo Lanjutan (B)

class Titik extends Bulatan {

}

public Titik(int nx, int ny) {super(0);x = nx;y = ny;

}

private int x, y;

public float luas( ) {System.out.print("(Dalam metod luas() bagi kelas Titik) ");return 0;

}

class Bulatan {

}

public Bulatan(int j) {jejari = j;

}

private int jejari;

public float luas( ) {System.out.print("(Dalam metod luas() bagi kelas Bulatan) ");return 22.0/7*jejari*jejari;

}

Pembatalan metod luas()

Terus kembalikan nilai 0 untuk luas Titik

Page 18: 8   Fitur Oo Lanjutan (B)

class Aplikasi {

}

public static void main(String[ ] args) {Bulatan bulatan = new Bulatan(7);Titik titik = new Titik(100, 50);System.out.println("Luas bulatan: "+bulatan.luas());System.out.println("Luas titik: "+titik.luas());

}

Output:Luas bulatan: (Dalam metod luas() bagi kelas Bulatan) 154.0Luas titik: (Dalam metod luas() bagi kelas Titik) 0.0

Page 19: 8   Fitur Oo Lanjutan (B)

D objD = new D();E objE = new E();B objB = new B();objE.buatIni();objD.buatIni();objB.buatIni();

• Rajah berikut menggambarkan proses yang terlibat dalam menentukan metod yang akan dilaksanakan apabila objek daripada E, D dan B dihantar mesej buatIni().

Page 20: 8   Fitur Oo Lanjutan (B)

• Mengenai super lagi…• Pertimbangkan segmen kod di

bawah:

class Segiempat {…

…}

public void papar( ) {for (int baris=0; baris < tinggi; baris++) {

for (int lajur=0; lajur < lebar; lajur++)System.out.print('*');

System.out.println();}

}

Contoh: Perhatikan kelas Segiempat ini..

Page 21: 8   Fitur Oo Lanjutan (B)

class SegiempatBerlabel extends Segiempat {

…}

public SegiempatBerlabel(int lbr, int tgg, String lb) {super(lebar, tinggi);label = lb;

}

private String label;

public void papar( ) {System.out.println("=================");for (int baris=0; baris < tinggi; baris++) {

for (int lajur=0; lajur < lebar; lajur++)System.out.print('*');

System.out.println();}System.out.println(label);System.out.println("=================");

}

Pembatalan metod

Mewarisi kelas Segiempat

sama dengan kod pada metod papar() dalam kelas Segiempat

Page 22: 8   Fitur Oo Lanjutan (B)

class Aplikasi {

}

public static void main(String[ ] args) {Segiempat segi4 = new Segiempat(4, 3);SegiempatBerlabel segi4x;segi4x = new SegiempatBerlabel(8, 3, "Blok");segi4.papar();System.out.println();segi4x.papar();

}

• Bolehkah kita mengguna semula metod papar() yang telah dibatalkan?

Page 23: 8   Fitur Oo Lanjutan (B)

• Kita boleh gunakan kata kunci super untuk melaksanakan suatu metod yang telah dibatalkan oleh subkelas

class SegiempatBerlabel extends Segiempat {…

…}

public void papar( ) {System.out.println("=================");super.papar();System.out.println(label);System.out.println("=================");

}

Melaksana metod yang telah dibatalkan

Page 24: 8   Fitur Oo Lanjutan (B)

Kawalan Capaian protected• Kawalan capaian protected membolehkan

suatu atribut atau metod dicapai oleh – semua subkelas di bawahnya.– semua kelas yang sepakej dengannya.

(Pakej akan dibincangkan kemudian. Buat masa ini, kelas yang anda takrifkan dimasukkan dalam suatu pakej lalai (default package))

• Atribut dan metod protected yang ditakrifkan bersifat seperti atribut dan metod public dalam skop capaiannya.

Page 25: 8   Fitur Oo Lanjutan (B)

Polimorfisma

• Java menyokong polimorfisma. Polimorfisma bermaksud

"satu mesej, pelbagai metod"

– Penggunaan polimorfisma boleh memudahkan penyenggaraan dan perluasan atur cara.

– Contoh...

Page 26: 8   Fitur Oo Lanjutan (B)

Gerak!

Page 27: 8   Fitur Oo Lanjutan (B)

• Pertimbangkan hirarki kelas Bentuk di bawah:

class Bentuk {…

…}

public void papar( ) { }

class Segiempat extends Bentuk {…

…}

public void papar( ) {…

}

class SegiempatSama extends Segiempat {…

}

Kelas Bentuk menakrifkan metod papar()

Kelas Segiempat membatalkan metod papar()

Page 28: 8   Fitur Oo Lanjutan (B)

class Segitiga extends Bentuk {…

…}

public void papar( ) {…

}

class SegitigaSama extends Segitiga {…

}

class SegitigaTepat extends Segitiga {…

}

class Segilima extends Bentuk {…

…}

public void papar( ) {…

}

Kelas Segitiga juga membatalkan metod papar()

Kelas Segilima juga membatalkan metod papar()

Page 29: 8   Fitur Oo Lanjutan (B)

• Pertimbangkan pula kod berikut yang mengaplikasikan polimorfisma.

class Aplikasi {

}

public static void main(String[ ] args) {Bentuk bentuk[] = new Bentuk[50];bentuk[0] = new SegiempatSama(...);bentuk[1] = new SegitigaTepat(...);bentuk[2] = new Segilima(...);for (int i=0; i < 3; i++)

bentuk[i].papar(); }

POLIMORFISMA perlaksanaan metod papar() ditafsirkan secara automatik

• Tidak perlu uji jenis bentuk untuk tentukan metod papar() yang ingin dilaksanakan

• Kod aturcara menjadi ringkas

Page 30: 8   Fitur Oo Lanjutan (B)

• Berdasarkan kepada konsep boleh tukarganti (substitutability), tatasusunan berjenis Bentuk boleh menyimpan rujukan kepada mana-mana objek daripada kelas keturunan Bentuk.

• Metod papar( ) yang dilaksanakan oleh pernyataan bentuk[i].papar() akan ditentukan oleh jenis sebenar objek yang dirujuk oleh bentuk[i]– Contoh..

Page 31: 8   Fitur Oo Lanjutan (B)

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()

Page 32: 8   Fitur Oo Lanjutan (B)

• Bagaimana jika kita ingin menambah bentuk segienam?

class Segienam extends Bentuk {…

…}

public void papar( ) {…

}

Page 33: 8   Fitur Oo Lanjutan (B)

• Kita cuma tambah kelas untuk bentuk segienam.

• 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.

• Lihat contoh: KlinikHaiwan.java dan KlinikMoo.java

Page 34: 8   Fitur Oo Lanjutan (B)

Haiwan PeliharaanString namaboolean laparHaiwanPeliharaan(Sring namanya)void perkenalDiri()void makan()String getNama()String keluarBunyi()

KucingKucing(String nama)void perkenalDiri()String keluarBunyi()

GajahGajah(String nama)String keluarBunyi()

Page 35: 8   Fitur Oo Lanjutan (B)

class HaiwanPeliharaan {

......}

private String nama;private boolean lapar;

public void perkenalkanDiri() {System.out.print(nama);if (lapar)

System.out.print(" (lapar)");else

System.out.print(" (kenyang)");System.out.println();

}

public HaiwanPeliharaan(String namanya) {nama = namanya;lapar = true;

}

public void makan() {System.out.println(nama+": Terima kasih! Mmmm..."+keluarBunyi());lapar = false;

}

Page 36: 8   Fitur Oo Lanjutan (B)

class KlinikHaiwan {

......}

private HaiwanPeliharaan[] lot;

public void senaraiHaiwan() {for (int i=0; i < lot.length; i++)if (!lotKosong(i))

lot[i].perkenalkanDiri();}

public KlinikHaiwan(int bilanganLot) {lot = new HaiwanPeliharaan[bilanganLot];for (int i=0; i < bilanganLot; i++)lot[i] = null;

}

public void waktuMakan() {System.out.println("================");System.out.println("WAKTU MAKAN!!!!!");System.out.println("================");for (int i=0; i < lot.length; i++)if (!lotKosong(i))

lot[i].makan();}

POLIMORFISMA

Page 37: 8   Fitur Oo Lanjutan (B)

class KlinikMoo {

}

public static void main(String[] args) {KlinikHaiwan klinikMoo = new KlinikHaiwan(30);

klinikMoo.daftar(new Kucing("Along"));klinikMoo.daftar(new Kucing("Rambo"));klinikMoo.waktuMakan();klinikMoo.daftar(new Kucing("KiKi"));klinikMoo.daftar(new Gajah("Jumbo"));klinikMoo.waktuMakan();

klinikMoo.senaraiHaiwan();}

Kompil dan laksanakan aturcara ini.

Fahamkan outputnya