Menguasai Polimorfisme Java: Konsep, Contoh, dan Praktik Terbaik
Polimorfisme Java
Jelajahi polimorfisme Java melalui penjelasan yang jelas dan contoh kode praktis, dan pahami bagaimana itu meningkatkan fleksibilitas dan penggunaan ulang kode.
Polimorfisme—sebuah tiang penting pemrograman berorientasi objek—berarti satu entitas dapat mengambil berbagai bentuk.
Itu artinya, entitas yang sama (metode, operator, atau objek) dapat melakukan operasi yang berbeda tergantung pada konteks.
Contoh: Polimorfisme Java
class Polygon { // method untuk merender bentuk public void render() { System.out.println("Merender Polygon..."); } } class Square extends Polygon { // merender Square public void render() { System.out.println("Merender Square..."); } } class Circle extends Polygon { // merender lingkaran public void render() { System.out.println("Merender Circle..."); } } class Main { public static void main(String[] args) { // buat objek Square Square s1 = new Square(); s1.render(); // buat objek Circle Circle c1 = new Circle(); c1.render(); } }
Output
Merender Square... Merender Circle...
Dalam contoh di atas, kita membuat superclass: Polygon dan dua subclass: Square dan Circle. Metode render() diwarisi oleh kedua subclass, tetapi masing-masing meng-override-nya untuk menyediakan logika rendering yang spesifik bentuk.
Kesimpulannya adalah render() berperilaku berbeda tergantung pada tipe objek aktual, yang merupakan inti polimorfisme.
Mengapa Polimorfisme?
Polimorfisme memungkinkan pengembang menulis kode yang bersih dan konsisten. Sebaliknya mendefinisikan metode terpisah seperti renderSquare() atau renderCircle(), satu metode render() menyesuaikan setiap bentuk, mengurangi redundansi dan meningkatkan kemudahan pemeliharaan.
Sementara metode terpisah akan bekerja, mereka cepat menyebabkan duplikasi kode dan API yang terfragmentasi. Polimorfisme menyatukan perilaku di bawah satu kontrak, memastikan bahwa setiap bentuk baru dapat diintegrasikan dengan cukup meng-override render().
Catatan: Metode print() juga menunjukkan polimorfisme—ia dapat mengeluarkan char, int, String, dan lebih banyak tanpa memerlukan multiple overloads.
Kita dapat mencapai polimorfisme di Java menggunakan teknik berikut:
Method Overriding
Method Overloading
Operator Overloading
Method Overriding Java
Saat subclass mendefinisikan metode dengan tanda tangan yang sama seperti metode di superclassnya, metode subclass meng-override metode superclass. Ini memungkinkan nama metode yang sama untuk melakukan operasi yang berbeda berdasarkan tipe runtime objek.
Contoh 1: Polimorfisme menggunakan method overriding
class Language { public void displayInfo() { System.out.println("Common English Language"); } } class Java extends Language { @Override public void displayInfo() { System.out.println("Java Programming Language"); } } class Main { public static void main(String[] args) { // buat objek Java class Java j1 = new Java(); j1.displayInfo(); // buat objek Language class Language l1 = new Language(); l1.displayInfo(); } }
Output:
Java Programming Language Common English Language
Di sini, Language berfungsi sebagai kelas dasar dan Java sebagai subclass. Metode displayInfo() didefinisikan di kedua kelas, tetapi setiap implementasi menyajikan informasi yang sesuai konteks.
Metode yang dieksekusi ditentukan pada waktu runtime, itulah sebabnya pola ini disebut runtime polymorphism.
Catatan: Metode yang dipanggil ditentukan selama eksekusi program. Oleh karena itu, method overriding adalah run-time polymorphism.
2. Method Overloading Java
Method overloading memungkinkan kelas memiliki beberapa metode dengan nama yang sama tetapi daftar parameter yang berbeda. Kompiler menentukan metode mana yang akan dipanggil berdasarkan argumen yang diberikan.
void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }
Teknik ini memungkinkan operasi logika yang sama untuk menerima masukan yang bervariasi.
Contoh 3: Polimorfisme menggunakan method overloading
class Pattern { // metode tanpa parameter public void display() { for (int i = 0; i < 10; i++) { System.out.print("*"); } } // metode dengan satu parameter public void display(char symbol) { for (int i = 0; i < 10; i++) { System.out.print(symbol); } } } class Main { public static void main(String[] args) { Pattern d1 = new Pattern(); // panggil metode tanpa argumen d1.display(); System.out.println("\n"); // panggil metode dengan satu argumen d1.display('#'); } }
Output:
********** ##########
Dalam contoh ini, kelas Pattern berisi dua metode display() yang di-overload. Versi tanpa parameter mencetak sepuluh bintang, sementara yang menerima char mencetak sepuluh salinan simbol yang diberikan.
Karena kompiler memilih metode pada waktu kompilasi, bentuk polimorfisme ini sering disebut compile-time polymorphism.
Catatan: Metode yang dipanggil ditentukan oleh kompiler. Oleh karena itu, ini juga dikenal sebagai compile-time polymorphism.
3. Operator Overloading Java
Operator Java dapat menunjukkan perilaku yang berbeda berdasarkan tipe operand. Misalnya, operator + melakukan penambahan numerik saat digunakan dengan angka dan penggabungan string saat digunakan dengan string.
+ dapat menambahkan angka atau menggabungkan string.
Operator logis dan bitwise seperti &, |, dan ! juga berperilaku berbeda tergantung pada tipe operand.
Di bawah ini cuplikan ilustratif yang menunjukkan bagaimana + menyesuaikan operandnya.
1. Dengan angka:
int a = 5; int b = 6; // + dengan angka int sum = a + b; // Output = 11
2. Dengan string:
String first = "Java "; String second = "Programming"; // + dengan string String name = first + second; // Output = Java Programming
Jadi, + di-overload di Java untuk melakukan penambahan dan penggabungan.
Catatan: Sementara bahasa seperti C++ mengizinkan operator overloading yang ditentukan pengguna, Java membatasi operator overloading hanya pada operator bawaan.
Variabel Polimorfik
Sebuah variabel dianggap polimorfik ketika ia dapat merujuk ke objek dari berbagai tipe selama eksekusi program. Di Java, referensi objek memungkinkan perilaku ini, memungkinkan referensi tipe dasar untuk menunjuk ke instance subclass.
Contoh: Variabel Polimorfik
class ProgrammingLanguage { public void display() { System.out.println("Saya adalah Bahasa Pemrograman."); } } class Java extends ProgrammingLanguage { @Override public void display() { System.out.println("Saya adalah Bahasa Pemrograman Berorientasi Objek."); } } class Main { public static void main(String[] args) { // deklarasikan variabel objek ProgrammingLanguage pl; // buat objek ProgrammingLanguage pl = new ProgrammingLanguage(); pl.display(); // buat objek kelas Java pl = new Java(); pl.display(); } }
Output:
Saya adalah Bahasa Pemrograman. Saya adalah Bahasa Pemrograman Berorientasi Objek.
Dalam ilustrasi ini, referensi pl dideklarasikan dengan tipe dasar ProgrammingLanguage tetapi ditetapkan objek dari kelas dasar dan subclassnya. Ini mendemonstrasikan upcasting dan polimorfisme runtime.