Sunday, October 18, 2009

Polimorphism

Polimorphism

Polimorphism bisa diartikan sebagai suatu object yang dapat memiliki berbagai bentuk, sebagai object dari classnya sendiri atau object dari superclassnya

Polimorphism ada 2 macam;

  1. Overloading, Penggunaan satu nama untuk beberapa method yang berbeda parameter
  2. Overriding, Terjadi ketika deklarasi method subclass sama dengan method dari superclassnya

OVERLOADING

  • Dalam sebuah kelas diperbolehkan ada lebih dari satu method dengan nama yang sama dengan catatan methods dapat dibedakan berdasarkan banyaknya parameter atau tipe data parameter formal

class Lingkaran {

double r;
Lingkaran (double r) {

this.r = r;

}
double Luas() {

return Math.PI*this.r*this.r;

}
double Luas (double r) {

//overloading method Luas() beda signature
this.r = r;
return Math.PI*this.r*this.r;

}
double Luas (int r) {

//overloading method Luas() beda signature
System.out.println(”tipe data harus double. r tidak diubah!”);
return Math.PI*this.r*this.r;

}
double Luas (double r, double PI) {

//overloading method Luas() beda signature
this.r = r;
return PI*this.r*this.r;

}

}

  • Overloading tidak bisa dilakukan dengan membedakan nilai kembaliannya

class Lingkaran {

double r;
Lingkaran (double r) {

this.r = r;

}
double Luas() {

return Math.PI*this.r*this.r;

}

}

  • Overloading juga bisa dilakukan pada sub kelasnya

class Lingkaran {

double r;
Lingkaran(double r) {

this.r = r;

}
double Luas() {

return Math.PI*this.r*this.r;

}
double Luas(double r) {

//overloading method Luas() beda signature
this.r = r;
return Math.PI*this.r*this.r;

}
double Luas(int r) {

//overloading method Luas() beda signature
System.out.println(”tipe data harus double. r tidak diubah!”);
return Math.PI*this.r*this.r;

}
double Luas(double r, double PI) {

//overloading method Luas() beda signature
this.r = r;
return PI*this.r*this.r;

}

}

class Tabung extends Lingkaran {

double h;
Tabung() {

super(0);
//konstruktor kelas turunan, ada keyword super()
//diisi nilai awal

}
double Luas(double r, double PI, double h) {

//overloading method Luas() beda signature
this.r = r;
return PI*this.r*this.r*this.h;

}

}

Overloading method dapat digunakan ketika kita mempunyai operasi yang sama namun berbeda implementasinya. Yang terpenting dalam melakukan ini, nama method harus sama, tapi mempunyai parameter yang berbeda. Terserah berbeda dari segi tipe datanya atau jumlah parameternya. Tergantung kebutuhan untuk implementasi dan nilai kembaliannya. Jadi yang perlu diingat saat melakukan overloading method:

• Nama method sama

• Parameter berbeda (baik tipe maupun jumlahnya)

• Tipe data nilai kembalian dapat berbeda atau sama

Overloading itu mendeklarasikan lebih dari satu kali dengan syarat-syarat tertentu. baik overloading method ataupun konstruktor

OVERRIDING

Overriding konsepnya sama dengan overloading yaitu menulis kembali method. Namun, caranya overriding menulis kembali method sama persis. Sama mulai dari nama method dan isinya dan mengimplementasi kembali di sub classnya. Overriding dipakai saat kita menggunakan method yang sama tapi berbeda implementasinya. Jadi overriding method mempunyai nama method yang sama, jumlah parameter dan tipe parameter serta nilai kembalian (return) method yang di override. Jika method memiliki modifier akses public, method overridenya juga harus public.

Contoh:

class Kendaraan {

public String getJenis() {

System.out.println(“Harga BBM turun”);

}

}

class Motor extends Kendaraan {

public String getJenis() {

System.out.println(“Harga BBM premium 4000 rupiah”);

}

}

NB:

  • class motor mengextends class kendaraan
  • class motor melakukan override method di kendaraan namun berbeda implementasi

Kesimpulan:

  • Override method merupakan method yang sama persis dengan method yang sudah ada di super kelasnya, biasanya perbedaannya adalah pada implementasi (program body)
  • Overidding tidak bisa dilakukan dalam kelas itu sendiri
  • Jadi Overidding kerat kaitannya dengan inheritance (pewarisan)

Contoh lain:

class Lingkaran {

double r;

Lingkaran(double r) {

this.r = r;

}
double Luas() {

return Math.PI*this.r*this.r;

}
double Luas(double r) {

this.r = r;
return Math.PI*this.r*this.r;

}

}
class Tabung extends Lingkaran {

double h;

Tabung() {

//konstruktor kelas turunan, ada super() dan diisi nilai awal
super(0);

}
double Luas(double r) {

//overriding (method and parameter sama)
this.r = r;
return Math.PI * this.r * this.r * this.h;

}

}

NB:

  • Class lingkaran melakukan overloading method Luas (beda signature)
  • Class tabung mengextends class lingkaran
  • Class tabung meng-override method Luas hasil dari overload. Jadi kita juga biosa mengoverride method hasil overloading juga

contoh lain:

class Sepeda{ //Sepeda.java

int kecepatan = 0;
int gir = 0;
// method
void ubahGir(int pertambahanGir) {

gir= gir+ pertambahanGir;
System.out.println(”Gir:” + gir);

}
void tambahKecepatan(int pertambahanKecepatan) {

kecepatan = kecepatan+ pertambahanKecepatan;
System.out.println(”Kecepatan:” + kecepatan);

}

}

class SepedaGunung extends Sepeda { //SepedaGunung.java

int setSadel;
void ubahGir(int pertambahanGir){

gir= 2*(gir+ pertambahanGir );
System.out.println(”Gir:” + gir);

}

}

class SepedaGunungBeraksi { //SepedaGunungBeraksi.java

public static void main(String[] args) {

// Membuat object
SepedaGunung sepedaku = new sepedaGunung();
// Memanggil method di object
sepedaku.tambahKecepatan(10);
sepedaku.ubahGir(2);
sepedaku.setSadel(20);

}

}

No comments:

Post a Comment

terima kasih anda sudah mengisi form komentar