[ HTML ] [ Java ] [ Bahasa C ]


Senin, April 15, 2019

Dynamic method dispatch atau runtime polymorphism pada bahasa Java

Prasyarat pengetahuan: Overriding pada Java dan Inheritance pada Java

Method overriding adalah salah satu cara untuk dalam bahasa Java untuk mendukung Runtime Polymorphism. Dynamic method dispatch adalah sebuah mekanisme dimana panggilan ke overridden method diselesaikan pada saat runtime, ketimbang pada waktu compile.

satu, Ketika overriden method dipanggil melalui referensi superclass, Java menentukan versi yang mana (superclass atau subclass) dari method tersebut yang akan dieksekusi berdasarkan tipe objek yang dimaksud ketika waktu panggil dilakukan. Proses tersebut dilakukan pada saat runtime.
dua, Pada waktu runtime, hal ini tergantung pada tipe dari objek referensi untuk (bukan tipe dari referensi variabel) menentukan versi dari overridden method yang akan dieksekusi.
tiga, Variabel referensi superclass dapat dilihat pada objek subclass. Hal ini dikenal juga dengan istilah upcasting. Java menggunakan kemampuan ini untuk memanggil overridden method pada saat runtime seperti diperlihatkan pada gambar 1.

upcasting pada bahasa pemrograman Java
Gambar 1 upcasting
sumber : geeksforgeeks.org

Jika superclass mengandung method yang overridden oleh sebuah subclass, maka ketika ada tipe objek yang berbeda dipanggil melalui referensi variabel superclass, maka method dengan versi yang berbeda akan dieksekusi. Berikut adalah contoh dari ilustrasi dynamic method dispatch:

// Program java

// mengilustrasikan Dynamic

// Method Dispatch menggunakan

// hierarchical inheritance.

class

void m1() 

{System.out.println("Method"

+" di dalam A m1");} 

 

class B extends

/* overriding m1() */

void m1() 

{System.out.println("Method"

+" di dalam B m1");} 

 

class C extends

/* overriding m1() */

void m1() 

{System.out.println("Method"

+" di dalam C m1");} 

 

/* Driver class */

class Dispatch 

 

public static void main(String args[]

/* objek tipe A */ 

A a = new A(); 

 

/* objek tipe B */ 

B b = new B(); 

 

/* objek tipe C */ 

C c = new C(); 

 

// dapatkan referensi tipe A

A ref; 

  

// ref mengacu pada objek A

ref = a; 

 

// memanggil versi A dari m1() 

ref.m1(); 

 

// sekarang ref mengacu pada

// objek B

ref = b; 

 

// memanggil versi B dari m1() 

ref.m1(); 

 

// sekarang ref mengacu pada

// objek C

ref = c; 

 

// memanggil versi C dari m1()

ref.m1(); 

}

 

}

Output:
Method di dalam A m1
Method di dalam B m1
Method di dalam C m1

Penjelasan: Program sebelumnya menciptakan satu superclass yang disebut A dan dua subclass yang disebut B dan C. kedua subclass tersebut overrides m1() method.

satu, di dalam main() method pada dispatch class, inisialisasi objek dari tipe A, B, dan C dideklrasikan seperti pada gambar 1.

A a = new A(); // object tipe A
B b = new B(); // object tipe B
C c = new C(); // object tipe C


isi main method pada dispatch class pada bahasa pemrograman Java
Gambar 1 isi main method pada dispatch class
sumber : geeksforgeeks.org
dua, selanjutnya referensi dari tipe A, yang disebut juga ref dideklarasikan, yang akan dinisialisasi dengan nilai null seperti pada gambar 2.

A ref; // dapatkan referensi tipe A

referensi tipe A
Gambar 2 referensi tipe A
sumber : geeksforgeeks.org

tiga, selanjutnya adalah menugasi setiap tipe dari objek (baik itu A, B, atau C) ke ref satu per satu, dan menggunakan referensinya untuk memanggil m1(). Seperti diperlihatkan pada output, dimana versi dari m1() yang dieksekusi ditentukan oleh tipe dari objek yang dimaksud ketika waktu panggil dilaksanakan seperti diperlihatkan pada gambar 3, 4, dan 5.

ref = a; // r mengacu pada object A
ref.m1(); // memanggil versi A dari m1()

memanggil versi A polimorfisme bahasa Java
Gambar 3 memanggil versi A
sumber : geeksforgeeks.org

ref = b; // r mengacu pada object B
ref.m1(); // memanggil versi B dari m1()


memanggil versi B polimorfisme bahasa Java
Gambar 4 memanggil versi B
sumber : geeksforgeeks.org

ref = c; // r mengacu pada object C
ref.m1(); // memanggil versi C dari m1()


memanggil versi C polimorfisme bahasa Java
Gambar 5 memanggil versi C
sumber : geeksforgeeks.org

Runtime Polymorphism dengan data member
Pada bahasa Java, override hanya dapat dilakukan pada method tetapi tidak pada variabel (data member), jadi runtime polymorphism tidak bisa dilakukan pada data member. contoh:

// Program Java

// mengilustrasikan fakta

// bahwa runtime polymorphism

// tidak bisa dilakukan pada

// data member.

 

/* class A */

class

{int x = 10;} 

 

/* class B */

class B extends

{int x = 20;} 

 

/* Driver class */

public class Test 

 

public static void main(String args[]

{

/* object dari tipe B */

A a = new B();  

// data member dari class A

// akan diakses. 

System.out.println(a.x);

}

 

}

Output:
10

Penjelasan: pada program sebelumnya, kedua class A (superclass) dan B (subclass) memiliki variabel yang sama 'X'. Selanjutnya akan dibuat objek class B, dari referensi 'a' yang merupakan tipe dari class A. Karena variabel tidak bisa overridden, maka statement "a.X" akan selalu memperlihatkan data member dari superclass.

Keunggulan dari Dynamic Method Dispatch
satu, Dynamic method dispatch memungkinkan Java untuk mendukung overridding dari method yang mana merupakan pusat untuk runtime polymoorphism.
dua, Memungkinkan class untuk melakukan spesifikasi method yang dapat digunakan secara umum untuk semua derivatifnya, sementara memungkinkan untuk subclass untuk mendefinisikan secara implementasi spesifik dari beberapa atau keseluruhan dari method.
tiga, Memungkinkan untuk subclass menambahkan method spesifik subclass untuk mendefinisikan beberapa implemetasi spesifik.

Static vs dynamic binding
satu, Static binding selesai dijalankan prosesnya pada saat waktu compile sedangkan dynamic binding selesai dijalankan prosesnya pada saat waktu runtime.
dua, private, final, dan static method serta variabel lain menggunakan static binding dan terikat oleh compiler, sementara overridden method terikat selama runtime berdasarkan tipe dari runtime objek.

Tidak ada komentar:

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D