analisis kode polimorfisme

20
Tugas Sistem Terdistribusi Esensi Pemrograman Berorientasi Objek dengan Java, Polimorfisme, dan Object Class Disusun oleh: Ikhsanudin Hakim | 34626 M. Risqi Utama S. | 34330 Azkario Rizky P. | 33792

Upload: klwerjwekltj

Post on 26-Jun-2015

423 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Analisis Kode Polimorfisme

Tugas Sistem Terdistribusi

Esensi Pemrograman Berorientasi Objek dengan Java, Polimorfisme, dan Object Class

Disusun oleh:

Ikhsanudin Hakim | 34626M. Risqi Utama S. | 34330Azkario Rizky P. | 33792

JURUSAN TEKNIK ELEKTRO DAN TEKNOLOGI INFORMASIUNIVERSITAS GADJAH MADA

YOGYAKARTA

Page 2: Analisis Kode Polimorfisme

PENDAHULUAN

Dalam pemrograman berorientasi objek, terdapat metode inheritance, yakni suatu metode yang digunakan untuk menurunkan suatu kelas ke kelas bau sehingga kelas baru tersebut memiliki sifat yang diwariskan dari kelas induk tadi. Pewarisan atau inheritance ini tidak hanya tidak hanya dapat digunakan untuk menggunakan ulang definisi kelas untuk membuat kelas baru, tetapi juga memberikan fasilitas bagi programmer java untuk mengimplementasikan polimorfisme.

Kata polimorfisme memiliki arti kemampuan untuk memiliki beberapa wujud yang berbeda. Dalam istilah pemrograman, kata ini memiliki arti kemampuan suatu variabel referensi objek untuk memiliki aksi berbeda bia method yang sama dipanggil, di mana aksi method tergantung dari tipe objeknya. Polimorfisme memungkinkan programmer mengenali dan mengeksploitasi keserupaan-keserupaan di antara kelas-kelas yang berbeda.

Jadi, kemampuan dari reference untuk mengubah sifat menurut object apa yang dijadikan acuandinamakan polimorfisme. Polimorfisme menyediakan multiobject dari subclasses yang berbeda untuk diperlakukan sebagai object dari superclass tunggal, secara otomatis menunjuk method yang tepat untuk menggunakannya ke particular object berdasar subclass yang termasuk di dalamnya.

Pada polimorfisme, programmer dapat menyimpan variabel referensi objek dari subclass dengan tipe super class. Misalnya terdapat superclass “Hewan” dan subclass “Kuda”. Maka, pembuatan objek seperti ini:

Hewan x = new Kuda();

Dalam mengimplementasikan konsep polimorfisme dalam program, terdapat beberapa hal yang perlu dipenuhi, yaitu:

Method yang dipanggil harus melalui variabel dari basis class atau super class. Method yang dipanggil harus juga menjadi method dari basis class. Signature method harus sama baik pada super class maupun sub class. Method access atribute pada subclass tidak lebih terbatas dari basis class.

InterfaceDalam impelementasi polimorfisme pada suatu program sering dijumpai penggunaan interface.

Interface bukan merupakan suatu prototipe suatu kelas yang berguna ditinjau dari perspektif rancangan logis. Interface mirip dengan kelas abstrak. Yang membedakan adalah bahwa kelas abstrak dapat diimplementasikan secara parsial, sedangkan interface merupakan mirip kelas yang tidak diimplementasikan sepenuhnya. Artinya interface dikatakan sebagai kelas yang tidak memiliki definisi apapun, baik dari field maupun methodnya (hanya deklarasi).

Interface menyediakan fasilitas untuk mendefinisikan protokol kelas tanpa khawatir rincian-rincian implementasi. Dengan cara tersebut, programmer dapat membuat proyek besar menjadi sangat mudah dikelola.

Interface berisi kumpulan nama metode tanpa implementasi. Interface ini digunakan untuk mendefinisikan fungsionalitas yang digunakan beberapa kelas tapi tidak menyatakan cara fungsionalitas tersebut didefinisikan dalam suatu itu. Contoh: Interface SepedaMotor tidak mendefinisikan keseluruhan aspek, tetapi menjamin mempunyai kemampuan tertentu. Semua motor selalu mempunyai kemampuan menghidup-matikan mesin, mengatur kecepatan (menaikkan atau menurunkan kecepatan) mesin, berjalan, dan sebagainya.

Jadi, interface hana digunakan untuk mendeklarasikan koleksi method dan konstanta(field). Untuk menggunakan interface tersebut dilakukan dengan mengimplementasikan interface tersebut.

Page 3: Analisis Kode Polimorfisme

Apabila suatu kelas mengimplementasikan interface, maka semua konstata akan dimiliki kelas tersebut. Di samping itu, kelas tersebut harus mengimplementasi semua method yang terdapat pada interface.Interface haru dideklarasikan public dan secara default merupakan static dan final. Sedangkan method dalam interface otomatis selalu abstract dan public.

Object ClassKetika suatu class dibentuk sebenarnya class tersebut merupakan subclass dari class Object

(java.lang.Object). Hal ini karena java.lang.Object merupakan hirarki class yang paling utama dari semua class Java. Proses subclass dari java.llang.Object terjadi secara otomatis tanpa perlu ditentukan secara eksplisit. Jadi, class Object merupakan superclass(moyang) bagi semua kelas lain.

Dengan demikian suatu kelas yang dibuat oleh programmer mewarisi seluruh konstanta maupun method yang terdapat dalam superclass Object tersebut. Class Object ini memiliki 11 method, di antaranya toString(), clone(), finalize(), dan sebagainya.

Dalam pemrograman, kelas object ini sangat erat kaitannya dengan polimorfisme. Hal ini dikarenakan ketika beberapa class yang dibuat pasti menjadi turunan dari class Object dan umumnya memiliki bentuk yang berbeda –beda.

Page 4: Analisis Kode Polimorfisme

PEMBAHASAN

Pada pembahasan ini, terdapat analisis kode pada beberapa program yang menggunakan polimorfisme, interface, Object Class.

The Essence of OOP Using Java, Polymorphism and the Object Class

Sebelum membahas prinsip polymorphism, terlebih dahulu akan dibahas tentang Class object dan bagaimana cara meng-inheritnya.

Sebagaimana yang telah diketahui bahwa class Object merupakan class default yang ada pada java yang berisi method-method:

clone() equals(Object obj) finalize() getClass() hashCode() notify() notifyAll() toString() wait() wait(long timeout) wait(long timeout, int nanos)

Sehingga setiap class akan menurunkan method-method tersebut dari class Object. Sebagai contoh:class A extends Object{}

Code diatas merepresentasikan penurunan class A dari class Object. Sehingga tentu saja method-method yang ada pada Object class akan diturunkan pada class A secara otomatis.

Namun, method-method tersebut tentu saja dapat ditimpa (di-override) sesuai dengan kebutuhan. Seperti berikut ini:

class B extends A{  public String toString() {    return "toString in class B";  }}

class C extends B

Page 5: Analisis Kode Polimorfisme

{  public String toString() {    return "toString in class C";  }}

Code diatas merepresentasikan penurunan class B dari class A yang sebelumnya telah diturunkan dari class Object. Dan class C diturunkan dari class B yang sebelumnya juga telah diturunkan dari class A. Sehingga dapat digambarkan struktur hierarkisnya sebagai berikut:

Di dalam Class B dan Class C terdapat method toString() yang akan mengoverride method toString() yang ada pada class Object. Dicontohkan override yang dilakukan hanyalah mengubah perilaku method toString() untuk menampilkan teks tertentu. Seperti “toString in class B” dan “toString in class C”.

Kemudian pada Class objectClass yang memiliki Main method akan diterapkan sebuah bentuk polymorphism sederhana sebagai berikut:

public class objectClass{  public static void main(String[] args) {    Object varA = new A();    String v1 = varA.toString();    System.out.println(v1);        Object varB = new B();    String v2 = varB.toString();    System.out.println(v2);        Object varC = new C();    String v3 = varC.toString();    System.out.println(v3);

  }

Page 6: Analisis Kode Polimorfisme

}

Bila dibahas lebih mendetail: Object varA = new A();    String v1 = varA.toString();    System.out.println(v1);

Akan dibentuk objek baru (instance) varA dari class A. Kemudian akan dipanggil method toString() melalui objek varA dan hasilnya akan disimpan pada variable string v1. Dan yang terakhir dituliskan statement untuk menampilkan isi dari variable string v1.

Object varB = new B();    String v2 = varB.toString();    System.out.println(v2);

Untuk class B, dibentuk objek baru (instance) varB dari class B. Kemudian akan dipanggil method toString() melalui objek varB dan hasilnya akan disimpan pada variable string v2. Dan yang terakhir dituliskan statement untuk menampilkan isi dari variable string v2.

Object varC = new C();    String v3 = varC.toString();    System.out.println(v3);

Begitu juga terhadap class C, dibentuk objek baru (instance) varC dari class C. Kemudian akan dipanggil method toString() melalui objek varC dan hasilnya akan disimpan pada variable string v3. Dan yang terakhir dituliskan statement untuk menampilkan isi dari variable string v3.

Bila diamati lebih spesifik, terlihat bahwa dalam tutorial tersebut penulis menuliskan Object varC = new C();bukan tertulis A varA = new A(); walaupun sebenarnya penulisan seperti ini tidaklah menimbulkan syntax error.

Inilah salah satu esensi penerapan polymorphism, yang membiarkan lebih dari 1 objek dari sub-class sub-class dan diperlakukan sebagai objek dari super class tunggal. Dalam kasus ini terdapat tiga sub-clas (A, B, dan C) dan satu super-class (Object).

Bila di-compile maka akan diperoleh output sebagai berikut:

Page 7: Analisis Kode Polimorfisme

Dari hasil compile tersebut terlihat Class A yang tidak meng-override menghasilkan output sistertugas.A@19821f yang sebenarnya didapat dari method default toString pada Java seperti dibawah ini:

public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

Dimana nilai A@19821f didapat secara random dari fungsi Integer.toHexString(hashCode()).Sedangkan Class B dan Class C yang telah di-override menghasilkan output seperti yang telah dideklarasikan, yakni toString inClass B dan toString inClass C.

The Essence of OOP Using Java, Polymorphism and Interfaces, Part 1

Source Code:

interface I1{  public void p();}//end interface I1

interface I2 extends I1{  public void q();}//end interface I2

class A extends Object{  public String toString() {    return "toString in A";  }//end toString()

  public String x() {    return "x in A";  }//end x()}//end class A

class B extends A implements I2

{  public void p(){  }//end p()    public void q(){  }//end q();}//end class B

class C extends Object implements I2{  public void p(){  }//end p()    public void q(){  }//end q();}//end class B

public class Poly05{  public static void main(String[] args) {  }//end main}

Output:

Page 8: Analisis Kode Polimorfisme

Penjelasan:

Program di atas hanya dimaksudkan untuk menjelaskan konsep Polymorphism dan Interface dalam Java sehingga memang pada method Main-nya tidak ada kode yang diimplementasikan. Jadi program di atas memiliki output yang kosong. Polymorphism bisa diartikan sebagai suatu object dengan 1 nama namun memiliki banyak bentuk. Sedangkan interface itu sendiri seperti layaknya class namun semua anggotanya public dan abstrak.

Kode di atas diawali dengan mendeklarasikan sebuah interface I1. Seperti telah dijelaskan di atas, Interface berisi method yang memiliki acces modifier public dan bersifat abstrak. Method yang bersifat abstrak ini maksudnya adalah method tersebut tidak diimplementasikan. Tampak bahwa method p yang ada pada interface I1 tidak diimplementasikan. Kodenya bisa dilihat lagi di bawah ini:

interface I1

{  public void p();

}//end interface I1

Selanjutnya pada program di atas, dibuat lagi sebuah interface I2 yang diturunkan dari Interface I1. Berikut ini kodenya:

interface I2 extends I1

{

  public void q();

}//end interface I2

Sebagaimana diketahui bahwa cara yang digunakan untuk menurunkan suatu class adalah digunakan keyword extends. Begitu pula dengan Interface. Cara yang digunakan untuk menurunkan interface juga dengan menggunakan keyword extends seperti terlihat pada kode di atas. Interface I2 ini memiliki sebuah abstrak method q. Kemudian kode di bawahnya mendefinisikan sebuah class bernama A yang diturunkan dari class Object.

class A extends Object{  public String toString() {

Page 9: Analisis Kode Polimorfisme

    return "toString in A";  }//end toString()

  public String x() {    return "x in A";  }//end x()}//end class A

Seperti telah dijelaskan pada bab sebelumnya, class Object ini merupakan class default yang diturunkan dari java.lang. Class ini berisi 12 method yang salah satunya adalah method toString(). Class A di atas meng-override method toString() yang ada dimiliki oleh class Object. Class toString() pada class Object memiliki nilai balik berupa string sehingga pada method yang di-override juga harus memiliki nilai balik berupa string. Karena memiliki nilai balik berupa string, maka method tersebut harus disertai oleh kode yang mengembalikan nilai berupa string. Keyword return di atas yang digunakan untuk mengembalikan nilai balik berupa string. String-nya sendiri berupa teks “toString in A”. Selain meng-override method toString() class A juga memiliki method x yang juga memiliki nilai balik string seperti terlihat pada kode di atas.

Selanjutnya, kode di bawahnya juga mendefinisikan sebuah class bernama class B yang diturunkan dari class A dan mengimplementasikan interface I2. Berikut ini kodenya:

class B extends A implements I2{  public void p(){  }//end p()    public void q(){  }//end q();}//end class B

Perlu diketahui bahwa setiap class yang mengimplementasikan interface harus mengimplementasikan semua abstrak method yang ada dalam interface tersebut. Class B di atas mengimplementasikan interface I2 di mana interface I2 sendiri merupakan turunan dari interface I1. Dengan demikian, class B harus mengimplementasikan semua abstrak method yang ada pada interface I1 dan I2. Itulah sebabnya pada class B tersebut terdapat method p dan method q yang keduanya memiliki acces modifier public. Class B di atas juga diturunkan dari class A. Hanya saja penurunan dari sebuah class tidak mewajibkan sebuah class yang diturunkannya untuk mengimplementasikan method yang ada pada class tersebut. Namun semua method public yang ada pada class A juga dimiliki oleh class B. Kemudian kode di bawah kode di atas juga digunakan untuk membuat sebuah class yang bernama class C. Class C ini diturunkan dari class Object dan mengimplementasikan Interface I2. Berikut ini kodenya:

class C extends Object implements I2{  public void p(){  }//end p()

Page 10: Analisis Kode Polimorfisme

    public void q(){  }//end q();}//end class B

Class C diturunkan dari class Object sehingga juga memiliki semua method public yang ada pada class Object. Jadi sebenarnya class C ini bisa meng-override method toString() seperti pada class A. Selain diturunkan dari class Object, class C juga mengimplementasikan interface I2 seperti layaknya class B. Jadi class C juga harus mengimplementasikan method p dan q.

Semua source code di atas pada dasarnya dibuat untuk menjelaskan konsep Interface. Konsep interface ini diarahkan untuk membuat polymorphism karena memang polymorphism tidak akan bia dibuat dengan baik kecuali dengan interface. Itulah sebabnya kode method Main di atas tidak diimplemantasikan karena source code di atas memang khusus dibuat untuk menjelaskan konsep interface.

The Essence of OOP Using Java, Polymorphism and Interfaces, Part 2

Source code:

interface I1{ public void p();}

interface I2 extends I1{ public void q();}

class A extends Object{

@Override public String toString(){ return "toString in A"; } public String x(){ return "x in A"; }}

class B extends A implements I2{ public void p(){ System.out.println("p in B"); } public void q(){ System.out.println("q in B"); }

}

class C extends Object implements I2{ public void p(){ System.out.println("p in C"); } public void q(){ System.out.println("q in C"); } }

public class Poly06{ public static void main( String[] args){

I1 var1 = new B(); var1.p(); ((I2)var1).q(); System.out.println("");

I2 var2 = new B(); var2.p();//OK var2.q();//OK //Following won't compile //String var3 = var2.x(); String var3 = ((A)var2).x();//OK

Page 11: Analisis Kode Polimorfisme

System.out.println(var3); var3 = var2.toString();//OK System.out.println(var3); System.out.println("");

Object var4 = new B(); //var4.p();//won't compile ((I1)var4).p();//OK

System.out.println("");

var2 = new C(); var2.p();//OK var2.q();//OK System.out.println(""); }}//end program

Penjelasan:Program di atas merupakan program yang sama seperti program sebelumnya tetapi sudah

dilengkapi dengan tambahan kode. Program tersebut mengimplementasikan karakteristik Object Oriented Programming (OOP), yakni Polymorphism dan Interface. Pada program tersebut dicontohkan penggunaan konsep polimorfisme dari kelas-kelas sama atau dari kelas-kelas yang mengimplementasi interface-interface yang sama. Adapun hasil akhir eksekusi program tampak di bawah ini:

Pada program tersebut terdapat 2 interface, interface I1 dan interface I2 yang diturunkan dari interfaceI1. Interface I1 memiliki method p() dan Interface I2 meiliki method q().

interface I1{ public void p();}

interface I2 extends I1{ public void q();}

Sebagaimana yang telah dijelaskan sebelumnya, interface digunakan untuk membuat suatu prototipe bagi suatu kelas di mana menjelaskan fungsionalitas suatu kelas dan tidak menjelaskan bagaimana kelas tersebut harus diimplementasikan. Sebagaimana yang tampak pada interface di atas, bahwa pada interface method-method yang ada hanya dideklarasikan dan tidak diimplementasikan. Dengan kata lain, method tersebut dikatakan sebagai abstract method yang mana method ini wajib diimplementasikan di setiap kelas yang mengimplementasikan interface tersebut.

Kemudian pada program tersebut, terdapat kelas A yang diturunkan dari kelas Object.

class A extends Object{

@Override public String toString(){ return "toString in A"; }

Page 12: Analisis Kode Polimorfisme

public String x(){ return "x in A"; }}

Kelas A tersebut memiliki 2 method, Void toString() dan String x(). Method toString ini sebenarnya merupakan method yang dimiliki kelas induk (yakni kelas Object), sehingga ketika method tersebut dimodifikasi (diimplementasi ulang) dengan menampilkan nilai balik “to String in A”, maka berarti kelas A tersebut telah melakukan overriding atas method tersebut. Overriding terjadi ketika deklarasi method subclass dengan nama dan parameter yang sama dengan method dari superclassnya, tetapi implementasinya dapat berbeda.

Selanjutnya terdapat kelas B yang diturunkan dari kelas A dan mengimplementasi interface I2.

class B extends A implements I2{ public void p(){ System.out.println("p in B"); } public void q(){ System.out.println("q in B"); }}

Pada kelas tersebut terdapat 2 method, yakni p() dan q() di mana method tersebut merupakan method yang dimiliki oleh interface I2. Hal ini karena kelas B yang mengimplementasi interface I2 harus mengimplementasi seluruh method pada interface I2.

Selanjutnya pada program tersebut terdapat kelas C yang diturunkan dari kelas Object dan mengimplementasi interface I2. Pada kelas ini juga terdapat 2 method, yakni method p() dan q() yang merupakan method yang diimplementasi dari interface I2. Kasusnya sama seperti kelas B, hanya saja output kedua method pada kelas C ini berbeda dengan output method pada kelas A.

class C extends Object implements I2{ public void p(){ System.out.println("p in C"); } public void q(){ System.out.println("q in C"); } }

Dari keseluruhan kelas dan interface yang dibuat, hirarki kelas dapat dilihat pada diagram uml di bawah ini:

Page 13: Analisis Kode Polimorfisme

Setelah pembuatan interface dan kelas-kelas tersebut, berikutnya terdapat kelas yang bernama Poly6. Kelas ini merupakan kelas utama (main class) karena memiliki main method yang digunakan untuk menjalankan program.

Pada main method, pertama-tama dilakukan runtun eksekusi perintah berikut:

I1 var1 = new B(); var1.p(); ((I2)var1).q(); System.out.println("");

Jadi pertama-tama dibentuk sebuah objek dari kelas B. Pada umumnya, pembuatan objek dilakukan dengan perintah seperti ini:

B var1 = new B();

Akan tetapi, pada program tersebut nilai dari object B tidak diumpankan pada variabel objek dari Kelas B. Hal ini karena dalam konsep polimorfisme, suatu kelas dapat menyimpan nilai referensi dari objek bentukan subclassnya. Karena I1 merupakan interface yang diimplementasi oleh kelas B, maka variabel referensi yang bertipe I1 dapat menyimpan nilai referensi dari objek bentukan kelas B.

Setelah terbentuk objek var1, maka dapat dilakukan pemanggilan seluruh method yang dimiliki objek var1, salah satunya method p(). Hasil pemanggilan method tersebut muncul tulisan “p in b”.

Namun, jika method q() dari objek var1 tersebut dipanggil, maka akan terjadi error. Padahal jika ditelusuri var1 yang merupakan instance kelas B seharusnya memiliki method p(). Alasannya karena method q() yang terdapat pada kelas B tidak dideklarasikan pada interface I2, sementara var1 disimpan dengan tipe interface I1. Oleh karenanya, untuk memanggil method q() tersebut perlu dilakukan casting object ke tipe I2 seperti yang tampak pada program:

Page 14: Analisis Kode Polimorfisme

((I2)var1).q();

Jadi, dalam OOP, dapat dibentuk suatu variabel referensi objek dari subclass denga tipe superclass, atau dengan tipe interface yang diimplementasi oleh kelas tersebut. Akan tetapi jika demikian halnya, maka pada objek bertipe superclass atau interface yang diimplementasi tersebut tidak dapat dilakukan pemanggilan seluruh method yang dimiliki oleh subclass.

I1 var1 = new B();

Pada contoh tersebut diciptakan sebuah variabel referensi objek bernama var1 dari kelas B dan disimpan dengan tipe interface I1. Jadi pada saat tersebut var1 memiliki sifat sebagai I1, yakni memiliki satu method p(). Ketika method p() tersebu dipanggil, outputnya adalah tulisan “p in B” sebagaimana instruksi method p() yang diimplementasikan pada kelas B.

Kemudian pada program tersebut terdapat beberapa beris instruksi sebagai berikut: I2 var2 = new B(); var2.p();//OK var2.q();//OK

Instruksi tersebut intinya sama seperti instruksi sebelumnya. Hanya saja variabel referensi objek (var2) dari kelas B ini disimpan dengan tipe Interface I2.Berbeda dengan sebelumya, karena interface I2 mengimplementasi interface I1, maka kedua method p() dan q() dapat dipanggil dari variabel var2 tersebut.

Kemudian, sebagaimana yang tampak pada program tersebut, var2 merupakan instance dari kelas B, yang mana kelas B ini merupakan kelas yang diturunkan dari kelas A yang memiliki method x dengan nilai balik string. Maka jika diperhatikan sekilas method x() tersebut dapat dipanggil langsung melalui objek var2 dengan cara :var2.x();

Akan tetapi hal tersebut tidak dapat dilakukan karena perlu diingat kembali bahwasannya var2 ini masih bertipe I2, sebagaimana pada pendeklarasian awal sehingga hanya dapat melakukan pemanggilan method yang terdapat pada interface I2 (method p() dan q()).

//Following won't compile //String var3 = var2.x(); String var3 = ((A)var2).x();//OK System.out.println(var3); var3 = var2.toString();//OK System.out.println(var3); System.out.println("");

Suatu hal yang ganjil apabila var2 yang merupakan instance dari kelas B tidak bisa memanggil method x(). Sebenarnya ketika var2 yang diciptakan dengan tipe I2, variabel var2 tersebut masih memiliki sifat-sifat yang dimiliki kelas B, diantaranya memiliki method x() yang dapat dipanggil. Akan tetapi pemanggilannya dilakukan dengan cara melakukan peng-casting-an objek ke dalam tipe yang diingingkan. Jadi, untuk memanggil method x() harus meng-casting var2 sebagai objek dari kelas A dengan cara :

((A)var2).x();

Page 15: Analisis Kode Polimorfisme

Var3 yang berisi hasil pemanggilan method x() di atas ketika ditampilkan dengan instruksi:

System.out.println(var3);

Maka hasilnya adalah muncul tulisan “x in A”.

Di samping itu, sebagaimana diketahui bahwa var2 masih memiliki hubungan inheritance dengan kelas A. Oleh karena itu, var2 memiliki method toString yang diimplementasi pada kelas A.

var3 = var2.toString();System.out.println(var3);

Apabila dieksekusi maka hasilnya muncul tulisan “toString in A” yang berati method toString kelas A dieksekusi.

Sebagaimana telah dijelaskan sebelumnya, pada suatu program dapat dibuat variabel referensi objek dari subclass dengan tipe superclass. Contohnya seperti yang tampak pada potongan instruksi selanjutnya:

Object var4 = new B(); //var4.p();//won't compile ((I1)var4).p();//OK System.out.println("");

Dari instruksi tersebut tampak bahwa instance /variabel referensi objek kelas B (var4) dibuat dan disimpan dengan tipe superclass-nya yakni kelas Object. Dalam kondisi ini, method p() yang sebenarnya dimiliki kelas B tidak dapat dipanggil melalui var4 tetapi harus melalui peng-casting-an objek terlebih dahulu ke dalam interface I1 sebagaimana yang telah dijelaskan sebelumnya.

Selanjutnya, pada bagian terakhir terdapat instruksi berikut:

var2 = new C(); var2.p();//OK var2.q();//OK System.out.println("");

Pada instruksi tersebut dilakukan penggantian nilai var2 yang semula berisi nilai instance dari kelas B dengan nilai instance kelas C. Jadi, var2 merupakan berisi nilai referensi dari instance kelas C dan variabel ini bertipe I2 yang merupakan interface yang diimplementasi kelas C. Dalam keadaan ini, pemanggilan method p() dan q() melalui var2 akan menghasilkan output yang sesuai sebagaimana tampak di bawah ini:

Page 16: Analisis Kode Polimorfisme

Jadi, dari keseluruhan program yang ada tampak bahwa dalam konsep pemrograman berorientasi objek dikenal istilah polimorfisme, yakni kemampuan objek-objek yang memiiki antarmuka yang identik tetapi dengan aktivitas/perilaku yang berbeda. Contohnya pada program tersebut terdapat beberapa kelas yang mengimplementasi interface I1 atau I2 sehingga sama-sama memiliki method p() atau q(). Namun, ketika method tersebut dipanggil pada masing-masing objek, output yang dihasilkan berbeda-beda.