Belajar Pemrograman Java Dari Dasar

Memahami Dynamic Dan Static Binding Pada Program Java

Apa Yang Dimaksud Dengan Binding?

Dalam belajar program Java pasti tidak terlepas dari yang namanya method. Binding merupakan hubungan antara pemanggilan method dan definisi method.

Untuk lebih jelasnya perhatikan gambar di bawah ini:

binding_program_java


Pada gambar di atas, pemanggilan method dengan kendaraan_1.bergerak() merupakan binding yang terhubung dengan definisi method bergerak() demikian juga dengan kendaraan_1.berhenti() merupakan binding yang terhubung dengan definisi method berhenti().

Sebagai aturan pada Java, pada setiap method yang dipanggil maka akan selalu terdapat definisi method. Karena error akan muncul jika compiler tidak menemukan definisi method yang tepat untuk setiap pemanggilan method.

Dynamic Binding

Seperti yang sudah anda ketahui, method dapat diimplementasikan dalam beberapa class melalui rantai inheritance.

Kemudian Java Virtual Machine akan memutuskan mengenai method mana yang akan dipilih pada saat runtime.

Sebelum lebih memahami mengenai dynamic binding ini, ada dua istilah yang perlu dimengerti terlebih dahulu, yaitu:

  • Tipe yang dideklarasikan, ini adalah variabel referensi untuk objek atau declared type.
  • Tipe aktual, yaitu class aktual dimana declared type menjadi variabel referensi untuk objek dari class tersebut
 Contoh :

Object myObject = new A();
System.out.println(myObject.toString());

Pada contoh di atas, tipe aktual dari myObject adalah A karena myObject mereferensikan suatu objek yang dibuat dengan new A();.

Selanjutnya, method toString() manakah yang akan di panggil? Ternyata method toString() yang akan dipanggil ditetapkan oleh tipe aktual dari myObject. Ini di kenal dengan dynamic binding.

Seperti inilah contoh cara kerja dynamic binding:

a) Terdapat beberapa class yang terkait dalam rantai inheritance yaitu class A, B, C, D dan E, dan paling puncak adalah class Objeck.

c) Class E adalah subclass dari class D, class D adalah subclass dari class C demikian seterusnya sampai dengan class A sub class dari Object.

Perhatikan diagram berikut ini:



c) Seperti kita ketahui, bahwa class Object memiliki method toString(), dan class lain bisa meng-override method tersebut. Dalam hal ini method toString tersebut di implementasikan oleh class A, B, dan C.

Perhatikan kode di bawah ini:

public class A extends Object {
 
 @Override
 public String toString(){
  
  return "method toString() dari class A dipanggil!";
 }
 
}

public class B extends A {
 
 @Override
 public String toString(){
  
  return "method toString() dari class B dipanggil!";
 }

}

public class C extends B {
 
 @Override
 public String toString(){
  
  return "method toString() dari class C dipanggil!";
 }
 
}

public class D extends C {
 
 //tidak mengoverride method toString()

}
public class E extends D{
 
 //tidak mengoverride method toString()

}

Kemudian class dibawah ini untuk mendemonstrasikan dynamic binding:

public class TestDynamicBinding {
 //Method perintah dengan parameter tipe Object
 static void perintah(Object myObject){
  
  System.out.println(myObject.toString());
 }
 
 public static void main(String[] args) {
  
  perintah(new E());//memanggil method toString dari class C
  perintah(new D());//memanggil method toString dari class C
  perintah(new C());//memanggil method toString dari class C
  perintah(new B());//memanggil method toString dari class B
  perintah(new A());//memanggil method toString dari class A
  perintah(new Object());
  
 }
 
}

Contoh output:
method toString() dari class C dipanggil!
method toString() dari class C dipanggil!
method toString() dari class C dipanggil!
method toString() dari class B dipanggil!
method toString() dari class A dipanggil!
java.lang.Object@3ee284

Penjelasan:
  • Method perintah() mengambil parameter dengan tipe Object, sehingga anda dapat memanggil method tersebut dengan objek apapun, misalnya new E(), new D(), new C(), new B(), new A() dan new Object().


  • Ketika method perintah(Object myObject) dieksekusi, maka argumen method toString() milik myObject akan dipanggil. Yang perlu menjadi perhatian di sini adalah myObject ini bisa saja merupakan instance dari class E, D, C, B, A atau Object.


  • Class C, B, A dan Object memiliki implementasi tersendiri pada method toString() dimana implementasi tersebut akan ditetapkan oleh tipe aktual myObject pada saat runtime.


  • Ketika myObject merupakan instance dari class E dan dipasskan pada method dengan perintah(new E());, maka compiler akan mencari method toString() yang diimplementasikan pada class E, kemudian jika tidak di temukan akan mencari lagi di class D dan seterusnya.


  • Karena class E dan D tidak mengimplementasikan method toString(), maka compiler akan menggunakan method toString() dari class C ketika myObject merupakan instance dari class E atau class D. Alur pencarian ini akan dilakukan dari class yang paling spesifik terlebih dahulu kemudian terus bertahap pada class yang paling general pada inheritance.


  • Ketika myObject merupakan instance dari clas C, B, A, dan Object,  maka method toString() yang dipanggil akan sesuai dengan implementasinya masing-masing pada class-class tersebut.

Suatu method bisa diimplementasikan dalam beberapa class melalui inheritance. Kemudian Java Virtual Machine secara dinamis melakukan bind pada method tersebut pada saat runtime dan implementasi itu ditetapkan oleh tipe aktual dari variabel.

Dynamic binding terjadi pada saat runtime, disebut juga late binding karena terjadi pada saat program berjalan.

Static Binding

Static binding terjadi pada saat compile time dan disebut juga early binding karena terjadi sebelum program berjalan. Jadi ini hanyalah konsep di mana objek dapat mengetahui method mana yang akan dipanggil pada saat compile time.

Method final, private dan static termasuk ke dalam static binding karena method tersebut tidak bisa di override dan tipe dari class tersebut ditetapkan pada saat compile time.

Berikut ini adalah contohnya :

public class Hewan {
 
 public static void makan(){
  
  System.out.println("Hewan makan!");
  
 }

}

public class Harimau extends Hewan {
 
 public static void makan(){
  
  System.out.println("Harimau makan!");
  
 }
 
 public static void main(String[] args) {
  
  Hewan objek1 = new Harimau();
  objek1.makan();
  
  Hewan objek2 = new Hewan();
  objek2.makan();
  
 }

}


Pada contoh di atas terdapat dua buah class yaitu class Hewan dan Harimau. Kedua class memiliki method yang sama yaitu makan(). Karena method tersebut adalah method static maka tidak bisa di override. Sehingga ketika objek dari class Harimau dibuat dengan variael referensi dari class Hewan, method makan() yang dipanggil adalah method milik class Hewan atau super class.

Method overloading juga adalah bagian bagian dari static binding.

Perbedaan Antara Dynamic Dan Static Binding

Berikut ini adalah perbedaan antara dynamic dan static binding yang perlu untuk diketahui.

Dynamic Static
Terjadi saat runtime Terjadi saat compile time
Objek aktual digunakan untuk binding Objek aktual tidak digunakan untuk binding
Method selain private, static final menunjukkan dynamic binding karena tidak bisa di override Method private, static final tidak bisa di override, sehingga termasuk static binding
Method overriding termasuk dynamic binding Method overloading termasuk static binding

Share on Facebook
Share on Twitter
Share on Google+

Artikel Menarik Lainnya :