Home » Java » Polimorphism di Java – Java Object Oriented (2) :

Polimorphism di Java – Java Object Oriented (2) :

by Bagus Dharma Iswara
by Bagus Dharma Iswara

Apa Itu Polimorphism?

Polimorfisme berarti “banyak bentuk”, dan itu terjadi ketika kita memiliki banyak kelas yang terkait satu sama lain melalui pewarisan. Pewarisan memungkinkan kita mewarisi atribut dan metode dari kelas lain. Polimorfisme menggunakan metode tersebut untuk melakukan tugas yang berbeda. Ini memungkinkan kami untuk melakukan satu tindakan dengan cara berbeda.

Polimorfisme adalah kemampuan suatu objek untuk mengambil berbagai bentuk. Penggunaan polimorfisme yang paling umum di OOP terjadi ketika referensi kelas induk digunakan untuk merujuk ke objek kelas anak. Objek Java apa pun yang bisa lulus lebih dari satu tes IS-A dianggap polimorfik. Di Java, semua objek Java bersifat polimorfik karena objek apa pun akan lulus tes IS-A untuk tipenya sendiri dan untuk objek kelas.

Penting untuk diketahui bahwa satu-satunya cara yang mungkin untuk mengakses suatu objek adalah melalui variabel referensi. Variabel referensi hanya dapat terdiri dari satu jenis. Setelah dideklarasikan, jenis variabel referensi tidak dapat diubah. Variabel referensi dapat dipindahkan ke objek lain asalkan tidak dinyatakan final. Jenis variabel referensi akan menentukan metode yang dapat dipanggil pada objek.

Variabel referensi dapat merujuk ke objek apa pun dari tipe yang dideklarasikan atau subtipe apa pun dari tipe yang dideklarasikan. Variabel referensi dapat dideklarasikan sebagai kelas atau tipe antarmuka.

Berikut merupakan beberapa contoh dari Polimorphism

class Animal {
  public void animalSound() {
    System.out.println("The animal makes a sound");
  }
}

class Pig extends Animal {
  public void animalSound() {
    System.out.println("The pig says: wee wee");
  }
}

class Dog extends Animal {
  public void animalSound() {
    System.out.println("The dog says: bow wow");
  }
}

Sekarang kita bisa membuat objek Pig dan Dog dan memanggil metode animalSound () pada keduanya:

class Animal {
  public void animalSound() {
    System.out.println("The animal makes a sound");
  }
}

class Pig extends Animal {
  public void animalSound() {
    System.out.println("The pig says: wee wee");
  }
}

class Dog extends Animal {
  public void animalSound() {
    System.out.println("The dog says: bow wow");
  }
}

class MyMainClass {
  public static void main(String[] args) {
    Animal myAnimal = new Animal();  // Create a Animal object
    Animal myPig = new Pig();  // Create a Pig object
    Animal myDog = new Dog();  // Create a Dog object
    myAnimal.animalSound();
    myPig.animalSound();
    myDog.animalSound();
  }
}

Dapat kita buat juga sebuah contoh sederhana dari Polimorphism yaitu

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

Sekarang, kelas Deer dianggap polimorfik karena ini memiliki banyak pewarisan. Berikut ini adalah benar untuk contoh di atas

  1. Seekor Rusa atau Deer IS-A Animal.
  2. Seekor Rusa atau Deer IS-A Vegetarian.
  3. Seekor Rusa atau Deer IS-A Deer.
  4. Seekor Rusa atau Deer IS-A Object.

Ketika kita menerapkan fakta variabel referensi ke referensi objek Deer, pernyataan berikut adalah legal atau dapat dilakukan sebagai berikut

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

Semua variabel referensi d, a, v, o merujuk ke objek Deer yang sama di heap.

Metode Virtual

Kita akan menunjukkan kepada Anda bagaimana perilaku metode yang diganti di Java memungkinkan Anda memanfaatkan polimorfisme saat mendesain kelas Anda. Kita sudah membahas penggantian metode, di mana kelas anak bisa mengganti metode di induknya. Metode yang ditimpa pada dasarnya tersembunyi di kelas induk, dan tidak dipanggil kecuali kelas anak menggunakan kata kunci super dalam metode penggantian.

Contoh nya dapat kita tuliskan pada bahasa program java berikut

/* File name : Employee.java */
public class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }

   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}

Kemudian kita dapat mengextend kelas Employee dengan menuliskan

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
   
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

Sekarang, Anda mempelajari program berikut dengan hati-hati dan mencoba menentukan hasilnya

/* File name : VirtualDemo.java */
public class VirtualDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");   
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Kode diatas akan menghasilkan sebuah output

Constructing an Employee
Constructing an Employee

Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

Di sini, kami membuat contoh dua objek Gaji. Satu menggunakan referensi Gaji, dan yang lainnya menggunakan referensi Karyawan e. Saat menjalankan s.mailCheck (), compiler melihat mailCheck () di kelas Salary pada waktu kompilasi, dan JVM memanggil mailCheck () di kelas Salary pada saat proses.

mailCheck () di e sangat berbeda karena e adalah referensi Karyawan. Ketika kompilator melihat e.mailCheck (), kompilator melihat metode mailCheck () di kelas Karyawan. Di sini, pada waktu kompilasi, kompilator menggunakan mailCheck () di Employee untuk memvalidasi pernyataan ini. Namun, pada waktu proses, JVM memanggil mailCheck () di kelas Gaji.

Metode Overloading pada Java

Jika kelas memiliki beberapa metode yang memiliki nama yang sama tetapi berbeda dalam parameter, itu dikenal sebagai Metode Overloading. Jika kita harus melakukan hanya satu operasi, memiliki nama metode yang sama akan meningkatkan keterbacaan program.

Misalkan Anda harus melakukan penambahan bilangan yang diberikan tetapi bisa ada sejumlah argumen, jika Anda menulis metode seperti a (int, int) untuk dua parameter, dan b (int, int, int) untuk tiga parameter maka itu mungkin sulit bagi Anda dan programmer lain untuk memahami perilaku metode karena namanya berbeda.

Jadi, kami melakukan overloading metode untuk mengetahui program dengan cepat.

Keuntungan metode overloading adalah metode overloading ini dapat meningkatkan keterbacaan program.

Berbagai cara untuk metode overload adalah dapat dilakukan dengan dua cara untuk metode overload pada java.

  1. Dengan mengubah jumlah argumen.
  2. Dengan mengubah tipe data.

1. Metode Overloading – Mengubah Jumlah Argumen

Dalam contoh ini, kita akan membuat dua metode, metode add () melakukan penambahan dua angka dan metode add kedua melakukan penambahan tiga angka. Dalam contoh ini, kami membuat metode statis sehingga kami tidak perlu membuat instance untuk memanggil metode.

Dapat kita lihat pada kode berikut

     class Adder{  
        static int add(int a,int b){return a+b;}  
        static int add(int a,int b,int c){return a+b+c;}  
     }  

    class TestOverloading1{  
        public static void main(String[] args){  
          System.out.println(Adder.add(11,11));  
          System.out.println(Adder.add(11,11,11));  
        }
    }   // Ketika kode dijalankan akan menghasilkan output : 
         //  22
         //  33

2. Metode Overloading – Mengubah Tipe Data

Dalam contoh ini, kami akan membuat dua metode yang berbeda dalam tipe datanya. Metode penambahan pertama menerima dua argumen integer dan metode penambahan kedua menerima dua argumen ganda.

class Adder{  
   static int add(int a, int b){return a+b;}  
   static double add(double a, double b){return a+b;}  
}  

class TestOverloading2{  
    public static void main(String[] args){  
       System.out.println(Adder.add(11,11));  
       System.out.println(Adder.add(12.3,12.6));  
    }
}  // Ketika kode dijalankan akan menghasilkan output : 
         //  22
         //  24.9

Metode Overriding pada Java

Jika subclass (kelas anak) memiliki metode yang sama seperti yang dideklarasikan di kelas induk, itu dikenal sebagai penimpaan metode di Java. Dengan kata lain, Jika subclass menyediakan implementasi spesifik dari metode yang telah dideklarasikan oleh salah satu class induknya, itu dikenal sebagai method overriding.

Penggunaan Metode Overriding pada Java

  1. Metode overriding digunakan untuk menyediakan implementasi spesifik dari metode yang sudah disediakan oleh superclass-nya.
  2. Metode overriding digunakan untuk polimorfisme runtime.

Aturan Metode Overriding pada Java

  1. Metode tersebut harus memiliki nama yang sama seperti di kelas induk.
  2. Metode tersebut harus memiliki parameter yang sama seperti pada kelas induk.
  3. Harus ada hubungan IS-A (warisan).

Contoh metode overriding

//Creating a parent class.  
class Vehicle{  
  //defining a method  
  void run(){System.out.println("Vehicle is running");}  
}  
//Creating a child class  
class Bike2 extends Vehicle{  
  //defining the same method as in the parent class  
  void run(){System.out.println("Bike is running safely");}  
  
  public static void main(String args[]){  
  Bike2 obj = new Bike2();//creating object  
  obj.run();//calling method  
  }  
} // akan menghasilkan output : Bike is running safely

You may also like