MODUL XI,PBO 1

POLIMORPHISME (BERPERAN GANDA)
 

TUJUAN:
Membuat dan menjelaskan tentang Polimorphisme
Penggunaan polimorphisme dalam praktek
TEORI SINGKAT:
Polimorphisme adalah peran ganda yang dapat dilakukan oleh suatu method.
PELAKSANAAN PRAKTIKUM:
Listing program 1. Titik.java
public class Titik{
     protected int x;
     //atau gunakan public int x;
     protected int y;
     //atau gunakan public int y; jika menggunakan private akan error tidak bisa diakses oleh kelas turunannya
//konstruktor tanpa argumen
     public Titik(){
       System.out.println(“Konstruktor Titik tanpa argumen”);
       x=0;
       y=0;
     }
//Konstruktor dengan argumen x dan y
     public Titik(int x, int y){
     System.out.println(“Konstruktor Titik dengan Argumen”);
       this.x=x;
       this.y=y;
     }
//set kordinator Titik: x dan y
     public void setKoordinat(int xx, int yy){
       x=xx;
       y=yy;
     }
//ambil koordinat x
     public int getX(){
       return x;
     }
//ambil koordinat y
     public int getY(){
       return y;
     }
//Cetak ke layar
     public void cetak(){
       System.out.println(“X = ” + x + “, y = “+ y);
     }
}
Pada listing di atas ada beberapa konstruktor dan method. Konstruktor non parametrik maupun konstruktor dengan argumen/parameter yang dapat dimanfaatkan untuk melakukan pengisian atau mengkonstruksi value dari suatu variabel yang didefinisikan. Konstruktor tersebut yang akan menjadi suatu indikator pemanggilan di kelas main. Dengan konstruktor ini juga nantinya kita dapat menentukan suatu objek dan dapat mengetahui bagaimana suatu method dapat dipanggil dan bagaimana kita dapat mengetahui suatu method dapat bersifat polimorphisme.
Listing program Lingkaran.java
//Class Lingkaran mewarisi Titik
//Pusat lingkaran 9x,y) diambil dari class Titik
public class Lingkaran extends Titik{
protected double radius;//radius merupakan jari-jari lingkaran
//Konstruktor tanpa argumen
public Lingkaran(){
     super();
     radius=0.0;
     }
//Konstruktor argumen radius
public Lingkaran(int x, int y, double rad){
     super(x,y);
     setRadius(rad);
     }
//set radius dari Lingkaran
     public void setRadius(double rad){
       radius=(rad>=0.0 ? rad :0.0);
     }
//ambil radius dari Lingkaran
     public double getRadius(){
       return radius;
     }
//hitung luas Lingkaran
     public double luas(){
       return Math.PI * radius * radius;
     }
//cetakhasil ke layar dengan override
     public void cetak(){
       System.out.println(“Pusat  = [“+getX() +”, “+getY()+”]”);
       System.out.println(“Radius = “+radius);
       System.out.println(“Luas   = “+luas());
     }
}
Dapat listing program lingkaran ini kita membuat method sama dengan method yang berada pada kelas titik yaitu method cetak(). Hal ini suatu yang aneh jika tidak dipahami bahwa java mempunyai kemampuan polimorphisme atau fungsi ganda. Dengan kata lain bagaimana java mempunyai kemampuan untuk membedakan method cetak mana yang akan dijalankan. Demikian juga  kita membuat method cetak() pada kelas PersegiPanjang.
Listing  program PersegiPanjang.java
//class PersegiPanjang mewarisi Titik
//variabel protected x, y pada class Titik menjadi
//koordinat pojok kiri atas class PersegiPanjang
//class ini tinggal menambahkan x2, y2 sebagai
//koordinat pojok kanan bawah PersegiPanjang
public class PersegiPanjang extends Titik{
     public int x2, y2;
     public PersegiPanjang(){
       super();
       setPojokKananAtas(0,0);
     }
     public PersegiPanjang(int x, int y, int x2, int y2){
       super(x,y);
       setPojokKananAtas(x2,y2);
     }
     public void setPojokKananAtas(int x2, int y2){
       this.x2=x2;
       this.y2=y2;
     }
     @Override
     public void cetak(){
       System.out.println(“x1, y1)  = (“+x+”, “+y+”)”);
       System.out.println(“x2, y2)  = (“+x2+”, “+y2+”)”);
       System.out.println(“Luas     = “+luas());
     }
     public double luas(){
       return (x2-x)*(y2-y);
     }
}
Pada tiga buah kelas di atas akan ditampilkan pada method void main di bawah ini dengan melakukan pemanggilan terhadap method-method yang berada dalam kelas-kelas di atas. Namun dengan catatan kita tidak akan dapat memanggil kelas-kelas tersebut apabila dalam listing tidak kita tambahkan kata @Overriding. Dengan statemen @Overriding kompiler akan mendeteksi apakah ada method yang sama dalam kelas-kelas yang terhubung baik di super kelas maupun pada sub kelasnya. Apabila ada statemen @Overriding tetapi tidak ada nama method yang sama maka kompiler akan berjalan sukses namun pada saat dieksekusi pada kelas main akan terjadi error yang menyatakan bahwa tidak ditemukan method yang sama.
Dengan memanggil konstruktor berparameter kita dapat menciptakan objek yang kita ingikan sehingga dapat melakukan pemanggilan method. Walaupun nama method tersebut sama namun objek masih bisa membedakan dengan adanya konstruktor berparameter. Banyaknya parameter yang digunakan, tipe parameter yang digunakan masih dapat membedakan sehingga method cetak() mana yang akan diakses. Dan hasilnya dapat dilihat pada tampilan gambar pada saat menjalankan clas TestBentuk ini.
Membuat program TestBentuk.java
public class TestBentuk{
     public static void main(String[]args){
       Titik tt1=new Titik(5,6);
       tt1.cetak();
       Lingkaran ling1=new Lingkaran(12,18,6.4);
       ling1.cetak();
       PersegiPanjang pp1=new PersegiPanjang(4,5,10,9);
       pp1.cetak();
     }
}
Hasil Program:
Ketika program dipanggil dengan:
public class TestBentukModif{
     public static void main(String[]args){
       Titik tt1=new Titik(5,6);
       tt1.cetak();
       Titik tt2=new Lingkaran(12,18,6.4);
       tt2.cetak();
       Titik tt3=new PersegiPanjang(4,5,10,9);
       tt3.cetak();
     }
}
Bagaimana dengan proses pembuatan objek di atas, kelas yang dipanggil berbeda-beda tidak seperti biasanya. Pola yang biasa dipakai adalah nama_kelas [nama objek]=new nama_kelas (parameter). Sedangkan di sini kita melihat bahwa nama kelas lain dipanggil pada kelas yang berbeda, yaitu kelas Titik dipakai untuk menciptakan objek kelas lingkaran. Yang dapat membedakan adalah banyaknya parameter. Dan Kelas Titik juga digunakan untuk menciptakan objek tt3 pada kelas PersegiPanjang, inipun hanya dapat dibedakan dalam dari bentuk dan jumlah parameter. Pada kelas Titik ada dua buah parameter, pada kelas Lingkaran ada 3 buah parameter dan pada kelas PersegiPanjang ada 4 buah kelas parameter.
Apabila disimak maka fungsi tersebut dikenalikan oleh @Overriding statemen yang memperbolehkan  adanya method yang sama. Dengan adanya method yang sama maka akan menyederhanakan kita dalam melakukan pengingat dalam pemanggilan. Hanya saja kita memang harus tahu karakter parameter yang digunakan agar kita dapat mengetahui method cetak() mana yang akan kita gunakan. Karena java hanya melihat dari ciri-ciri parameter yang digunakan. Sebagai contoh di atas dia akan mengeksekusi method cetak() yang berada dalam kelas Titik ketika hanya diisi dengan 2 parameter. Kemudia dia akan mengeksekusi method cetak() ada kelas Lingkaran apabila diisi dengan 3 buah parameter (dua tipe integer dan satu buah parameter dapat diisi dengan double). Dan java akan mengindikasi bahwa method cetak() yang digunakan adalah method cetak() pada kelas PersegiPanjang apabila dia melihat adanya parameter yang berjumlah 4 buah integer.
Sedangkan di bawah ini adalah contoh penciptaan yang tidak benar, dimana kita menggunakan objek untuk menciptakan objek lain. Mungkinkah?
Modifikasi kelas TestBentukModif sebagai berikut:
public class TestBentukModif{
     public static void main(String[]args){
       Titik tt1=new Titik(5,6);
       tt1.cetak();
       Titik tt2=new Lingkaran(12,18,6.4);
       tt2.cetak();
       Titik tt3=new PersegiPanjang(4,5,10,9);
       pp1.cetak();
     }
}
Modifikasi lain untuk menampilkan:
public class TestBentukModif{
     public static void main(String[]args){
       Titik tt1=new Titik(6,4);
       tt1.cetak();
       Titik tt2=new Lingkaran(14,13,12.4);
       tt2.cetak();
       tt1=new PersegiPanjang(2,23,8,9);
       pp1.cetak();
     }
}
Hasil Running Program:
D:\MY Document\Materi Kuliah\Semester 2\Object Oriented Programming 1\Modul11-Polimorphisme\TestBentukModif.java:8: cannot find symbol
symbol  : variable pp1
location: class TestBentukModif
       pp1.cetak();
       ^
1 error
Tool completed with exit code 1
Pada listing kelas pemanggilan TestBentukModif di atas semua menimbulkan error yang sama yaitu sama-sama menyamaikan pesan bahwa tidak ditemukan variabel ppi yang terdifinisi. Namun apabila kita memasukkan salah satu objek hasil bentukan dari kelas yang sudah ada di atasnya maka objek tersebut dimodifikasi menjadi objek sesuai dengan objek yang baru saja diintaniasikan. Sebagaimana di bawah ini ketika pp1 kita ganti menjadi tt1 padahal tt1 pada awal program sudah menjadi objek dari kelas Titik. Tetapi ketika diinstaniasikan lagi menjadi objek berparameter empat bilangan inter dia diinstaniasi menjadi objek baru dan mengeluarkan hasil dari cetak() pada kelas PersegiPanjang.
Hasil Running Program:
public class TestBentukModifLain{
     public static void main(String[]args){
       Titik tt1=new Titik(6,4);
       tt1.cetak();
       Titik tt2=new Lingkaran(14,13,12.4);
       tt2.cetak();
       tt1=new PersegiPanjang(2,23,8,9);
       tt1.cetak();
     }
}
Membuat kelas tabung dengan override luas dan cetak
//kelas tabung turunan kelas lingkaran
public class Tabung extends Lingkaran{
     private double tinggi;
     //Konstruktor dengan argumen x, y, radius dan tinggi
     public Tabung(int x, int y, double radius, double tinggi){
       this.x=x;
       this.y=y;
       this.radius=radius;
       this.tinggi=tinggi;
     }
     //Method luas yang mengoverride method luas() pada kelas Lingkaran
     @Override
     public double luas(){
       return Math.PI * radius * radius;
     }
     public double volume(){
       return Math.PI * radius * radius*tinggi;
     }
     //Method cetak yang mengoverride method cetak() pada kelas Lingkaran
     @Override
     public void cetak(){
            System.out.println(“Pusat  = [“+getX() +”, “+getY()+”]”);
            System.out.println(“Radius = “+tinggi);
            System.out.println(“Radius = “+radius);
            System.out.println(“Luas   = “+luas());
            System.out.println(“volume = “+volume());
     }
}
Membuat kelas pemanggil an TestBentuk.java dengan method main:
public class TestBentuk{
     public static void main(String[]args){
       Titik tt1=new Titik(5,6);
       tt1.cetak();
       Titik tt2=new Lingkaran(12,18,6.4);
       tt2.cetak();
       Titik tt3=new PersegiPanjang(4,5,10,9);
       tt3.cetak();
       Titik tt4=new Tabung(4,5,6,7);
       tt4.cetak();
       Lingkaran ling=new Tabung(7,6,5,4);
       ling.cetak();
     }
}
Hasil Running program:
TUGAS:
public class Balok extends PersegiPanjang{
     public int z;
     public Balok(){
       System.out.println(“Kelas Balok tanpa parameter”);
       this.x=x;
       this.y=y;
       this.x2=x2;
       this.y2=y2;
       this.z=z;
     }
     public Balok(int x, int y, int x2, int y2, int z){
       System.out.println(“Kelas Balok dengan parameter”);
       this.x=x;
       this.y=y;
       this.x2=x2;
       this.y2=y2;
       this.z=z;
     }
     //Panjang = x2-x1; Lebar=y2-y; tinggi=z;
     @Override
     public double luas(){
       return (x2-x) * (y2-y);
     }
     //Panjang = x2-x1; Lebar=y2-y; tinggi=z;
     public double volumeBalok(){
       return luas() * z;
     }
     public void cetak(){
       volumeBalok();
       System.out.println(“Diketahui dengan adanya 2 buah titik, yaitu :”);
       System.out.println(“Pojok Kiri Atas (x1,y1) di titik [“+x+”,”+y+”]”);
       System.out.println(“Pojok Kanan Bawah (x2,y2) di titik [“+x2+”,”+y2+”] Maka :”);
       System.out.println(“Panjang = “+(x2-x));
       System.out.println(“Lebar   = “+(y2-y));
       System.out.println(“Tinggi  = “+z);
       System.out.println(“Volume  = “+volumeBalok());
     }
}
Membuat kelas pemanggilan:
public class TestBalok{
     public static void main(String[]args){
       Balok blk1=new Balok();
       blk1.cetak();
       Balok blk2=new Balok(3,8,4,12,5);
       blk2.cetak();
       Titik blk3=new Balok(2,4,9,18,10);
       blk3.cetak();
     }
}
Hasil running:
KESIMPULAN:
  1. Sifat polimorphisme method dapat diciptakan dengan adanya method dengan nama sama di dalam kelas yang berbeda tetapi mempunyai fungsi yang berbeda.
  2. Penggunaan method yang mempunyai polimorhisme ini kita harus jeli biasanya method ini mendefinisikan fungsinya melihat dari karakter parameter yang digunakan.

Method-method ini dapat dipanggil dengan menciptakan objek dari kelas-kelas yang berhubungan khususnya dari kelas super. Dengan kelas super ini objek dari kelas turunannya dapat diciptakan. Sekaligus dapat digunakan sebagai media pemanggilan method-method yang polimorhisme.

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s