[ HTML ] [ Java ] [ Bahasa C ]


Selasa, April 16, 2019

Overriding pada Java

Fitur overriding pada pemrograman berorientasi objek 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 pada bahasa Pemrograman Java
Gambar 1 overriding pada Java
sumber : geeksforgeeks.org

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

// 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. Hal ini juga dapat dilakukan pada 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. 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 gambar 2 memperlihatkan hasil yang didapat ketika mendefinisikan method dengan menggunakan signature sama sebagai method dalam superclass.


tabel override pada bahasa pemrograman Java
Gambar 2 tabel overriding
sumber : geeksforgeeks.org

// 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 compile, 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 (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, 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 3.

override vs overload pada bahasa pemrograman Java
Gambar 3 overriding vs overloadsumber : geeksforgeeks.org

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

Kenapa 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 librari kode untuk memanggil method dalam instance dari new class tanpa melakukan kompilasi ulang ketika maintain sebuah interface abstract adalah sesuatu yang powerful bagi perangkat pengembangan program. 

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

Kapan harus menggunakan overriding method? (beserta contoh)
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 implementasinya 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 4.

penerapan override method pada contoh program dalam bahasa pemrograman Java
Gambar 4 penerapan overriding method
sumber : geeksforgeeks.org

// 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

Tidak ada komentar:

Posting Komentar

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