Rabu, Mei 12, 2021

Overriding pada Java

Fitur overriding pada Pemrograman Berorientasi Objek atau OOP memungkinkan subclass atau child class untuk menyediakan implementasi spesifik dari method yang telah disediakan oleh salah satu superclass atau parent class. Ketika method dalam subclass memiliki kesamaan nama, kesamaan parameter atau signature, dan kesamaan tipe return (atau sub-tipe) sebagai method pada superclass, maka method dalam subclass akan disebut sebagai overriding dari method superclass seperti diperlihatkan pada gambar 1.


Method overriding adalah salah satu cara dari bahasa pemrograman Java untuk mencapai runtime polymorphism. Versi dari method yang dieksekusi akan ditentukan oleh object yang digunakan untuk memanggilnya. Jika object dari parent class digunakan untuk memanggil method, maka versi dalam parent class akan dieksekusi, tetapi jika object dari subclass yang digunakan untuk memanggil method, maka versi dalam child class akan dieksekusi. Dengan kata lain, tergantung dari tipe object yang jadi referensi untuk menentukan versi yang mana dari method overriding yang akan dieksekusi dan bukan tipe dari referensi variabel.

// Contoh program sederhana

// dari program Java

// mendemonstrasikan method

// overriding.

 

/* Base Class */

class Parent 

{

void show(){ 

System.out.println("Parent"

+" show()");} 

 

/* Inherited class */

class Child extends Parent 

// method overriding show()

// dari Parent.

@Override

void show() { System.out.println("Child"

+" show()"); } 

 

/* Driver class */

class Main 

 

public static void main(String[] args

// Jika tipe parent referensi

// mengacu pada parent objek,

// maka parent show akan

// dipanggil.

Parent obj1 = new Parent(); 

obj1.show(); 

 

// Jika tipe parent referensi

// mengacu pada child objek, 

//maka child show akan

// dipanggil.

 

// Hal ini disebut dengan

// runtime polymorphism.

Parent obj2 = new Child(); 

obj2.show(); 

}

 

}

Output:
Parent show()
Child show()

Aturan dari method overriding:
satu, Overriding dan access-modifier: access modifier untuk method overriding bisa memberikan akses lebih, tetapi tidak kurang daripada method overriding. Contohnya, instance protected method pada superclass dapat dibuat public, tetapi tidak bisa dibuat private, pada subclass. Dimana hal ini akan menyebabkan compile-time error.

// Contoh program Java yang

// mendemonstrasikan

// overriding dan

// access-modifier.

class Parent 

{

// method private tidak

// overriding. 

private void m1() { 

System.out.println("Dari"

+" parent m1()");} 

 

protected void m2() { 

System.out.println("Dari"

+" parent m2()"); } 

 

class Child extends Parent 

// new m1() method bersifat

// unik untuk child class.

private void m1(){ 

System.out.println("Dari "

+"child m1()");} 

 

// method overriding dengan

// lebih banyak aksesibilitas.

@Override

public void m2(){ 

System.out.println("Dari "

+"child m2()");} 

 

/* Driver class */

class Main 

 

public static void main(String[] args

Parent obj1 = new Parent(); 

obj1.m2(); 

 

Parent obj2 = new Child(); 

obj2.m2(); 

}

 

}

Output:
Dari parent m2()
Dari child m2()

dua, Final method tidak bisa overridde: jika tidak ingin method overridde, maka dapat dideklarasikan dalam bentuk final. Berikut contoh penggunaan final dengan inheritance.

// Program Java

// mendemonstrasikan final

// method tidak bisa

// overriding.

class Parent 

/* tidak bisa overriding */ 

final void show() { } 

 

class Child extends Parent 

/* akan menghasilkan error */

void show() { } 

}

Output:
13: error: show() in Child cannot override show() in Parent
void show() {  }
^
overridden method is final

tiga, Static method tidak bisa overriding (method overriding vs method hiding): ketika mendefinisikan static method dengan signature sama sebagai static method pada base class, maka hal tersebut akan dikenal sebagai method hiding.

Tabel pada tabel 1 memperlihatkan hasil yang didapat ketika mendefinisikan method dengan menggunakan signature sama sebagai method dalam superclass.

Tabel 1 Overriding pada Java
Superclass Instance MethodSuperclass Static Method
Subclass Instance MethodOverrideGenerates a Compile-time Error
Subclass Static MethodGenerates a Compile-time ErrorHides

// Program Java memperlihatkan

// jika method static

// diredefinisi oleh class

// asalnya, maka hasilnya

// tidak overriding, tetapi

// hiding.

class Parent 

// method static dalam base

// class yang akan tersembunyi

// (hidden) dalam subclass.

static void m1(){

System.out.println("Dari"

+" parent static m1()");} 

 

// Non-static method yang akan

// overriding dalam class

// asalnya. 

void m2(){

System.out.println("Dari"

+" parent non-static"

+"(instance) m2()");} 

 

class Child extends Parent 

// method ini menyembunyikan

// m1() dalam parent.

static void m1(){

System.out.println("Dari "

+"child static m1()");} 

 

// method ini overriding m2()

// dalam parent.

@Override

public void m2(){

System.out.println("Dari "

+"child non-static"

+"(instance) m2()");} 

 

/* Driver class */

class Main 

public static void main(String[] args

{Parent obj1 = new Child(); 

  

// Jika sesuai aturan

// overriding seharusnya

// memanggil static class

// child overriding method.

// Namun karena static method

// tidak bisa overriding, maka

// dipanggil calls Parent's

// m1().

obj1.m1(); 

 

// Overriding dapat bekerja

// dan memanggil Child's m2(). 

obj1.m2();}

}

Output:
Dari parent static m1()
Dari child non-static(instance) m2()

empat, Method private tidak bisa overridde: Method private tidak bisa overridde karena method ini terikat selama waktu kompilasi, bahkan tidak juga dapat dilakukan overriding dalam subclass.

lima, Method overriding harus memiliki return tipe yang sama atau subtipe: Mulai dari tipe Java 5.0 dan seterusnya hingga tipe versi terbaru sangat mungkin untuk memiliki tipe return yang berbeda untuk overriding method dalam child class, tetapi child return tipe harus sub tipe dari parent return tipe. Fenomenaini dikenal dengan istilah covariant return type.

enam, Memanggil overridde method dari subclass: parent class dapat dipanggil dalam method overriding menggunakan keyword super.

// Program Java

// mendemonstrasikan bahwa

// overriding method dapat

// dipanggil dari subclass.

 

/* Base Class */

class Parent 

{

void show(){ 

System.out.println("Parent"

+" show()");} 

 

/* Inherited class */

class Child extends Parent 

// method overriding show()

// dari Parent.

@Override

void show(){ 

super.show(); 

System.out.println("Child"

+" show()");} 

 

/* Driver class */

class Main 

public static void main(String[] args){ 

Parent obj = new Child(); 

obj.show();} 

}

Output:
Parent show()
Child show()

tujuh, Overriding dan constructor: constructor tidak bisa overriding sebagai parent, serta child class tidak bisa memiliki constructor dengan nama yang sama atau nama constructor harus selalu sama dengan nama class.

delapan, Overriding dan Exception-Handling: berikut ini ada dua aturan ketika overriding method terkait dengan exception-handling.
  • Aturan satu: Jika superclass method overriding tidak memberikan hasil exception, maka subclass overriding method hanya bisa memberikan unchecked exception, dan jika memberikan checked exception maka akan memerikan compile-time error.

// Program Java

// mendemonstrasikan

// overriding ketika

// superclass method tidak

// mendeklarasikan exception.

class Parent 

void m1(){

System.out.println("Dari"

+" parent m1()");} 

 

void m2(){

System.out.println("Dari"

+" parent m2()"); } 

 

class Child extends Parent 

@Override

// Tidak ada pesan ketika

// memberikan unchecked

// exception.

void m1() throws ArithmeticException 

{System.out.println("Dari"

+" child m1()");} 

 

@Override

/* Compile-time error */

 

// Muncul pesan ketika

// memberikan checked

// exception.

void m2() throws Exception

{System.out.println("Dari"

+" child m2");} 

 

}

Output:
error: m2() in Child cannot override m2() in Parent
void m2() throws Exception{ System.out.println("From child m2");}
^
overridden method does not throw Exception

  • Aturan dua: Jika superclass method overriding tidak memberikan exception, subclass method overriding hanya bisa memberikan hal yang sama juga, yaitu subclass exception. Jika memberikan parent exception dalam exception hirarki akan memberikan compile time error. Dan juga tidak memiliki guna apapun jika subclass overriding tidak memberikan exception apapun.

// Program Java

// mendemonstrasikan

// overriding ketika

// superclass method

// mendeklarasikan exception.

class Parent

void m1() throws RuntimeException{

System.out.println("Dari"

+" parent m1()");} 

 

class Child1 extends Parent

@Override

// tidak memiliki fungsi

// apapun jika memberikan

// exception yang sama.

void m1() throws RuntimeException 

{System.out.println("Dari"

+" child1 m1()");} 

}

 

class Child2 extends Parent

@Override

// tidak memiliki fungsi

// apapun jika memberikan

// subclass exception.

void m1() throws ArithmeticException 

{System.out.println("Dari"

+" child2 m1()");} 

}

 

class Child3 extends Parent

@Override

// tidak memiliki fungsi

// apapun jika tidak

// memberikan exception apapun. 

void m1() 

{System.out.println("Dari"

+" child3 m1()");} 

}

 

class Child4 extends Parent

@Override

/* compile-time error */

 

// muncul pesan ketika

// memberikan parent exception. 

void m1() throws Exception 

{System.out.println("Dari"

+" child4 m1()");} 

}

Output:
error: m1() in Child4 cannot override m1() in Parent
void m1() throws Exception
^
overridden method does not throw Exception

sembilan, Overriding dan abstract method: abstract method dalam interface atau abstract class akan bermakna sebagai overriding dalam class konkret asal, jika tidak, maka akan memberikan compile time error.

sepuluh, Overriding dan synchronized/strictfp method: kemunculan dari synchronized/strictfp modifier dengan method tidak akan memiliki efek apapun pada aturan overriding. Dengan kata lain, dimungkinkan untuk method synchronized/strictfp dapat overriding non synchronized/strictfp dan juga sebaliknya.

Catatan:
satu, Pada C++, dibutuhkan keyword virtual untuk melakukan overriding atau run time polymorphism. Pada Java, method tersebut bersifat default.

dua, Dapat memiliki multilevel method-overriding.

// Program Java

// mendemonstrasikan

// multi-level overriding.

 

/* Base Class */

class Parent

void show() { 

System.out.println("Parent"

+" show()"); } 

 

/* Inherited class */

class Child extends Parent

// Method overriding show()

// dari Parent.

void show() { 

System.out.println("Child"

+" show()"); } 

 

/* Inherited class */

class GrandChild extends Child

// Method overriding show()

// dari Parent.

void show() { 

System.out.println("GrandCh"

+"ild show()"); } 

 

/* Driver class */

class Main

public static void main(String[] args) { 

Parent obj1 = new GrandChild(); 

obj1.show(); } 

}

Output:
GrandChild show()

tiga, Overriding vs overloading:
  • #1, Overloading (overload) terkait dengan method sama tetapi signature berbeda. Overriding terkait dengan method sama, signature sama, tetapi class yang terhubung melalui inheritance berbeda seperti diperlihatkan pada gambar 2.


  • #2, Overloading adalah contoh dari compiler-time polymorphism dan overriding adalah contoh dari runtime polymorphism.

Alasan Menggunakan Method Overriding
Seperti dinyatakan sebelumnya, overridde method memungkinkan Java untuk mendukung runtime polymorphism. Polymorphism adalah hal yang penting pada pemrograman berorientasi objek untuk satu buah alasan, yaitu: memungkinkan penggunaan class umum untuk method spesifik yang akan menjadi acuan umum untuk semua class asalnya. Overriding juga memungkinkan subclass untuk mendefinisikan implementasi spesifik dari beberapa atau seluruh method tersebut. Overriding method adalah cara lain bagi Java untuk implement satu interface, multi method sebagai aspek dari polymorphism.

Dynamic method dispatch adalah salah satu mekanisme powerful dari rancangan berorientasi objek untuk reuse dan robust code. Kemampuan dari keberadaan library kode untuk memanggil method dalam instance dari new class tanpa melakukan kompilasi ulang ketika maintain sebuah interface abstract adalah sesuatu yang sangat berguna bagi perangkat pengembangan program. 

Overriding method memungkinkan untuk memanggil method dari class asal tanpa mengetahui tipe dari object class asalnya.

Alasan Harus Menggunakan Overriding Method
Overriding dan inheritance: Bagian dari kunci sukses penerapan polymorphism adalah memahami bahwa superclass dan subclass form dari sebuah hirarki yang bergerak dari khusus ke umum. Superclass menyediakan semua elemen yang dapat digunakan subclass secara langsung. Hal ini juga mendefinisikan bahwa class asal harus implement dari dirinya sendiri. Hal ini juga memungkinkan fleksibilitas subclass untuk mendefinisikan method-nya sendiri, namun masih menetapkan interface yang konsisten. Dengan mengkombinasikan inheritance dan overriding method, sebuah superclass dapat mendefinisikan bentuk umum dari method yang akan digunakan oleh semua dari subclass-nya sendiri.

Perhatikan contoh praktis dari penggunaan method overriding. Sebuah software management employee untuk sebuah organisasi, dengan kode program yang memiliki base class Employee sederhana, didalamnya terdapat method seperti raiseSalary(), transfer(), promot(), dan lain sebagainya. Perbedaan tipe dari employee seperti manager, engineer, dan lain sebagainya mungkin memiliki implementasi masing-masing dari method yang ditampilkan pada base class Employee. Untuk menyempurnakan software, dibutuhkan pencocokan daftar employee dimanapun dan pemanggilan method yang sesuai tanpa perlu mengetahui tipe dari employee. Contoh, user dapat menaikkan salary dari semua employee di dalam class-nya, dimana tidak perlu dikhawatirkan karena jika raiseSalary() ditampilkan untuk tipe employee spesifik, maka hanya method tersebut yang dapat dipanggil seperti diperlihatkan pada gambar 3.



// Program Java sederhana yang

// mendemonstrasikan aplikasi

// dari overriding.

 

/* Base Class */

class Employee

public static int base = 10000

int salary() 

{return base;} 

 

/* Inherited class */

class Manager extends Employee

// method overriding show()

// dari Parent.

int salary() 

{return base + 20000;} 

 

/* Inherited class */

class Clerk extends Employee

// method overriding show()

// dari parent.

int salary() 

{return base + 10000;} 

 

/* Driver class */

class Main

// method ini dapat digunakan

// untuk mencetak salary

// apapun dari employee

// menggunakan base class

// reference.

static void printSalary(Employee e

{System.out.println(e.salary());} 

 

public static void main(String[] args){ 

Employee obj1 = new Manager(); 

 

// Dapat digunakan untuk

// mendapatkan tipe dari

// employee menggunakan lebih

// banyak overriding

// method.loke getType().

System.out.print("Penghasilan"

+" Manager : "); 

printSalary(obj1); 

 

Employee obj2 = new Clerk(); 

System.out.print("Penghasilan"

+" Clerk : "); 

printSalary(obj2);} 

}

Output:
Penghasilan Manager : 30000
Penghasilan Clerk : 20000

6 komentar:

  1. Kenapa tidak bisa dilakukan override pada method static Java?

    BalasHapus
    Balasan
    1. Overloading adalah suatu mekanisme yang sifatnya mengikat panggilan method dengan body method secara dinamis berdasarkan parameter yang diteruskan ke method panggilan. Method static terikat pada waktu dilakukan kompilasi program menggunakan pengikatan yang sifatnya static. Oleh karena itu, maka tidak dapat dilakukan overriding pada method static Java.

      Hapus
  2. Method apa saja yang tidak bisa dilakukan override pada program Java?

    BalasHapus
    Balasan
    1. Method yang dinyatakan dalam bentuk final tidak bsia dilakukan override pada java. Method yang telah dideklarasikan static tidak dapat diganti tetapi dapat dilakukan pendeklarasian ulang pada program. Jika sebuah method tidak dapat diwariskan, maka method tersebut juga tidak dapat di override. Subclass dalam package yang sama dengan superclass instance dapat dilakukan override pada superclass method apapun yang tidak dideklarasikan sebagai private atau final.

      Hapus
  3. Apakah mungkin melakukan override pada constructor Java?

    BalasHapus
    Balasan
    1. Constructor memang terlihat seperti sebuah method namun sebenarnya tidak. Constructor tidak memiliki tipe kembalian dan namanya juga sam dengan nama class. Namun demikian, constructor tidak bisa dilakukan override. Jika ingin melakukan penulisan constructor pada sub class, maka kompilator akan memperlakukannya sebagai method dan akan mengharapkan tipe kembalian atau tipe return dan akan menghasilkan compile time error.

      Hapus

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