Upload
madzani-nusa
View
608
Download
5
Embed Size (px)
Citation preview
Fitur OO Lanjutan Java
Sufian IdrisMarini Abu Bakar
Jabatan Sains Komputer
Pengenalan
• Tajuk berikut akan dibincangkan:– Metod pembina– Penyaratan metod– Kawalan capaian– Hubungan pewarisan– Pensubkelasan– Pembatalan metod– Polimorfisma
Metod Pembina
• Pertimbangkan takrifan kelas berikut:class Akaun {
private String nbrAkaun;private boolean aktif;private String pemilik;
public void paparInfo( ) {System.out.println(“Nombor akaun: “+nbrAkaun);System.out.println(“Pemilik: “+pemilik);System.out.print(“Status: “);if (!aktif)
System.out.print(“TIDAK “);System.out.println(“AKTIF”);
}}
• Apakah yang berlaku jika kod berikut dilaksanakan?
Akaun akaunBaru = new Akaun( );akaunBaru.paparInfo( );
• Satu teknik untuk menangani masalah ini adalah memperkenalkan suatu metod yang tujuannya untuk mengawalkan (initialize) atribut objek. Contoh..
Akaun akaunBaru = new Akaun( );akaunBaru.pengawalan(“010-99333-03”,
“Nada Asyiqin”, true);akaunBaru.paparInfo( );
• Apakah kelemahan pendekatan ini?
• Terdapat dua cara untuk melakukan pengawalan atribut pada masa penciptaan objek:– Menspesifikasi nilai awal atribut pada
pengisytiharannya dalam takrifan kelas– Metod pembina (constructor)
Menspesifikasi nilai awal atribut
class Tabung {private int sen = 0;private String pemilik = null;
public void masuk(int jumSen) {sen += jumSen;
}public void keluar(int jumSen) {
sen -= jumSen;}
}
• Bagi setiap objek Tabung yang dicipta, nilai atribut sen objek tersebut diawalkan kepada 0.
for (int i=0; i < 3; i++)new Tabung( );
Metod pembina (constructor)class Tabung {
private int sen;private String pemilik;
public Tabung( ) {sen = 0;pemilik = null;
}public void masuk(int jumSen) {
sen += jumSen;}public void keluar(int jumSen) {
sen -= jumSen;}
}
Metod pembina
• Metod pembina dilaksanakan setiap kali suatu objek Tabung dicipta. Semasa perlaksanaan metod ini, nilai atribut sen objek Tabung yang dicipta diawalkan kepada 0.
• Perhatikan sekarang perlaksanaan kod berikut:
for (int i=0; i < 3; i++)new Tabung( );
• Metod pembina adalah suatu metod istimewa yang sesuai untuk meletakkan kod pengawalan yang perlu dilaksanakan oleh objek pada masa ia dicipta.
• Metod pembina tidak boleh mengembalikan apa-apa di akhir perlaksanaannya. Malah, sintaksnya tidak ada jenis kembali.
• Satu lagi kekangan: nama metod pembina mestilah sama dengan nama kelas.
• Metod pembina boleh juga diparameterkan. Untuk suatu objek melaksanakan metod pembina yang berparameter, nilai bagi setiap parameter metod itu perlu dihulurkan semasa penciptaan objek tersebut.
Contoh:class Tabung {
private int sen;private String pemilik;
public Tabung(int nilaiSen, String nama) {sen = nilaiSen;pemilik = nama;
}public void masuk(int jumSen) {
sen += jumSen;}public void keluar(int jumSen) {
sen -= jumSen;}
}
parameter
• Kod berikut menunjukkan satu contoh penciptaan objek Tabung.
Tabung tabungAdik = new Tabung(100, “Raziq”);
• Setiap kelas mesti menakrifkan sekurang-kurangnya satu metod pembina.
• Sekiranya pengaturcara tidak menakrifkan sebarang metod pembina untuk suatu kelas, maka pengkompil Java akan menakrifkan satu metod pembina lalai (default constructor) untuk kelas tersebut.
• Metod pembina lalai ini adalah suatu metod kosong tanpa sebarang parameter.
Contoh:class Akaun {
private String nbrAkaun;private boolean aktif;private String pemilik;public Akaun(String nomborAkaun, String nama) {
nbrAkaun = nomborAkaun;pemilik = nama;aktif = false;
}public void paparInfo( ) {
System.out.println(“Nombor akaun: “+nbrAkaun);System.out.println(“Pemilik: “+pemilik);System.out.print(“Status: “);if (!aktif)
System.out.print(“TIDAK “);System.out.println(“AKTIF”);
}public static void main(String[ ] args) {
Akaun akaun = new Akaun(“010-99333-03”, “Nada Asyiqin”);akaun.paparInfo( );
}}
Penyaratan Metod• Pertimbangkan segmen kod berikut:
class Cacing {
private int panjang;private char aksara;
public Cacing(int pjg, char aks) {panjang = pjg;aksara = aks;
}
private void paparBadan(int aks) {for (int i=0; i < panjang; i++)
System.out.print(aks);}
private void paparKepala() {System.out.print(":>");
}
}
public void papar1() {paparBadan(aksara);paparKepala();
}
public void papar2(char aks) {paparBadan(aks);paparKepala();
}
public void papar3(int faktor, char aks) {for (int i=0; i < faktor; i++)
paparBadan(aks);paparKepala();
}
Metod untuk memapar objek cacing
class Aplikasi {
}
public static void main(String[] args) {Cacing cacing = new Cacing(3, 'x');cacing.papar1();System.out.println();cacing.papar2('*');System.out.println();cacing.papar3(3, '=');
}
Output yang diperolehi:xxx:>***:>= = = = = = = = = :>
public void papar1() {paparBadan(aksara);paparKepala();
}public void papar2(char aks) {paparBadan(aks);paparKepala();
}public void papar3(int faktor, char aks) {
for (int i=0; i < faktor; i++)paparBadan(aks);
paparKepala();}
private void paparBadan(int aks) { for (int i=0; i < panjang; i++) System.out.print(aks);}
private void paparKepala() {System.out.print(":>");
}
• Ketiga-tiga metod papar1(), papar2() dan papar3() sebenarnya melakukan tugas yang sama: memaparkan objek Cacing. Alangkah cantiknya jika kita boleh gunakan nama yang sama.
• Ini boleh dilakukan dalam Java kerana adanya sokongan penyaratan metod. Menyarat metod bermaksud menggunakan nama yang sama untuk lebih daripada satu metod dalam suatu kelas.
• Contoh 1:– Tulis semula aturcara:
class Cacing {
private int panjang;private char aksara;
public Cacing(int pjg, char aks) {panjang = pjg;aksara = aks;
}
private void paparBadan(int aks) {for (int i=0; i < panjang; i++)
System.out.print(aks);}
private void paparKepala() {System.out.print(":>");
}
}
public void papar() {paparBadan(aksara);paparKepala();
}
public void papar(char aks) {paparBadan(aks);paparKepala();
}
public void papar(int faktor, char aks) {for (int i=0; i < faktor; i++)
paparBadan(aks);paparKepala();
}
Penyaratan metod : nama metod yang sama
class Aplikasi {
}
public static void main(String[] args) {Cacing cacing = new Cacing(3, 'x');cacing.papar();System.out.println();cacing.papar('*');System.out.println();cacing.papar(3, '=');
}
Contoh 2:• Metod println() sebenarnya telah disaratkan
dalam kelasnya.int pbhInt;double pbhDbl;System.out.println("UKM");System.out.println('X');System.out.println(pbhInt);System.out.println(pbhDbl);
• Metod-metod yang diberikan nama yang sama dalam suatu takrifan kelas mesti dapat dibezakan oleh Java. Dalam hal ini, Java menggunakan maklumat jenis dan urutan parameternya.
class Ujian {
}
public void output(double x) {System.out.println("versi double");
}
public void output(float x) {System.out.println("versi float");
}
public void output(double x, String y) {System.out.println("versi double, String");
}
public static void main(String[] args) {Ujian u = new Ujian();u.output(3.3);u.output(3.3f);u.output('k');u.output(5.2, "cuba");//u.output("RALAT");
}ralat pengkompilan
versi double
versi float
versi float
versi double, String
guna pengacuan automatik char => int => float
• Outputnya:versi doubleversi floatversi floatversi double, String
• Perhatikan kenyataan yang dikomenkan dalam metod main( ) di atas adalah suatu ralat kerana metod output(String) tidak ditakrifkan untuk objek Ujian.
• Perhatikan juga bahawa u.output('k');
menyebabkan metod output(float) dilaksanakan. Oleh kerana tidak ada metod output(char), maka Java akan menggunakan pengacuan automatik (automatic casting) ke atas parameter sebenar untuk menentukan metod yang terhampir.output(char) => output(int) => output(float)
• Metod pembina kerap disaratkan. Dengan itu, klien boleh memilih metod pembina yang sesuai untuk dilaksanakan dalam penciptaan suatu objek.
Contoh 1:class Segiempat {
…}
public Segiempat() {lebar = 1;tinggi = 1;
}
public Segiempat(int saiz) {lebar = saiz;tinggi = saiz;
}
public Segiempat(int lb, int tg) {lebar = lb;tinggi = tg;
}
private int lebar, tinggi;
Metod pembina disaratkan
class Aplikasi {
}
public static void main(String[] args) {Segiempat sg4a = new Segiempat();Segiempat sg4b = new Segiempat(5);Segiempat sg4c = new Segiempat(3, 4);...
}
Boleh pilih metod pembina yang sesuai
Contoh 2:• Kelas pustaka Date dalam pakej java.util
menakrifkan beberapa metod pembina:public Date();public Date(long milisaat);public Date(int tahun, int bulan, int hari);public Date(int tahun, int bulan, int hari, int jam, int
minit);public Date(int tahun, int bulan, int hari, int jam, int
minit, int saat);
Kawalan Capaian
• Kawalan capaian adalah berkaitan dengan skop: – Bagi pemboleh ubah ahli, ia menentukan kawasan
kod aturcara yang mana nilainya boleh dicapai. – Bagi metod ahli suatu kelas, ia menentukan
kawasan kod aturcara yang mana mesej bagi metod itu boleh dihantar kepada objek daripada kelas tersebut.
• Terdapat tiga kawalan capaian yang disediakan oleh Java iaitu private, protected dan public. Kawalan capaian protected akan diterangkan kemudian.
Kawalan Capaian private• Pertimbangkan kod aturcara di bawah:
class Wang{
}
public Wang(int r, int s) {ringgit = r; sen = s;System.out.println("Jumlah sen: "+jumlahSen());
}
private int jumlahSen() {return 100*ringgit+sen;
}
private int ringgit, sen;
OK!
• Atribut private hanya boleh dicapai dalam kelasnya.
• Penghantaran mesej untuk melaksanakan metod private hanya boleh dilakukan di dalam kelas metod tersebut.
class Aplikasi {
}
public static void main(String[] args) {Wang wang = new Wang(5, 20);wang.ringgit = -100;System.out.println("Jumlah sen: "+wang.jumlahSen());
}
RALAT!
Kawalan Capaian public• Pertimbangkan pula kod aturcara di bawah:
class Wang{
}
public Wang(int r, int s) {ringgit = r; sen = s;System.out.println("Jumlah sen: "+jumlahSen());
}
public int jumlahSen() {return 100*ringgit+sen;
}
public int ringgit, sen;
OK!
YUK!!
class Aplikasi {
}
public static void main(String[] args) {Wang wang = new Wang(5, 20);wang.ringgit = -100;System.out.println("Jumlah sen: "+wang.jumlahSen());
}
OK!
YUK!!
• Atribut public boleh dicapai di dalam dan di luar kelasnya.
• Atribut objek TIDAK digalakkan diisytiharkan sebagai public kerana ini bercanggah dengan prinsip pengkapsulan.
• Penghantaran mesej untuk melaksanakan metod public boleh dilakukan di dalam dan di luar kelas metod tersebut.
Hubungan Pewarisan
• Hubungan pewarisan boleh dipandang sebagai hubungan diantara kategori objek dengan subkategori-subkategorinya. – Contoh..
Pengangkutan
Pengangkutan
PengangkutanUdara
Pengangkutan
PengangkutanUdara
PengangkutanLaut
Pengangkutan
PengangkutanUdara
PengangkutanDarat
PengangkutanLaut
• Hubungan pewarisan juga dikenali sebagai hubungan “is-a”. – Contoh...
Pengangkutan
Pengangkutan Laut
Pengangkutan Darat
Pengangkutan Udara
Hubungan pewarisan
Objek Pengangkutan Laut “is a” Pengangkutan
Objek Pengangkutan Darat “is a” Pengangkutan
Objek Pengangkutan Udara “is a” Pengangkutan
• Berdasarkan kepada maksud hubungan “is-a”, setiap objek daripada suatu subkategori akan memiliki atribut dan perlakuan kategori induknya disamping atribut dan perlakuan subkategori tersebut. – Contoh...
• Suatu hirarki pewarisan boleh dibina menerusi proses pengitlakan (generalization) atau pengkhususan (specialization).
Pengangkutan
kelajuan
getKelajuan( )
Pengangkutan Udara
ketinggian
terbang( )
Atribut
Perlakuan
kelajuan
getKelajuan()
terbang()
ketinggian
bersambung....