8 fitur oo lanjutan (b)

Post on 23-Jun-2015

523 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Fitur OO Lanjutan Java(samb)

Sufian IdrisMarini Abu Bakar

Jabatan Sains Komputer

Pengenalan

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

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

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

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

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

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.

• 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

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

• 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) {

^

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.

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

Pembatalan Metod

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

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

• 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

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

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

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

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

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

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

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?

• 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

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.

Polimorfisma

• Java menyokong polimorfisma. Polimorfisma bermaksud

"satu mesej, pelbagai metod"

– Penggunaan polimorfisma boleh memudahkan penyenggaraan dan perluasan atur cara.

– Contoh...

Gerak!

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

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

• 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

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

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

• Bagaimana jika kita ingin menambah bentuk segienam?

class Segienam extends Bentuk {…

…}

public void papar( ) {…

}

• 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

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

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;

}

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

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

top related