Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> java

Java - Polimorfisme

Polimorfisme adalah kemampuan suatu objek untuk mengambil banyak 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 dapat lulus lebih dari satu tes IS-A dianggap polimorfik. Di Java, semua objek Java bersifat polimorfik karena objek apa pun akan lulus uji IS-A untuk tipenya sendiri dan untuk kelas Object.

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 dari tipe yang dideklarasikan. Variabel referensi dapat dideklarasikan sebagai kelas atau tipe antarmuka.

Contoh

Mari kita lihat sebuah contoh.

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

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

Saat kami menerapkan fakta variabel referensi ke referensi objek Rusa, deklarasi berikut adalah sah −

Contoh

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

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

Metode Virtual

Di bagian ini, saya akan menunjukkan kepada Anda bagaimana perilaku metode yang diganti di Java memungkinkan Anda memanfaatkan polimorfisme saat mendesain kelas Anda.

Kita sudah membahas metode override, di mana kelas anak dapat menimpa metode di induknya. Metode yang diganti pada dasarnya tersembunyi di kelas induk, dan tidak dipanggil kecuali kelas anak menggunakan kata kunci super di dalam metode utama.

Contoh

/* 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;
   }
}

Sekarang misalkan kita memperluas kelas Karyawan sebagai berikut

/* 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 cermat dan mencoba menentukan outputnya

/* 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();
   }
}

Ini akan menghasilkan hasil berikut

Keluaran

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 instance dua objek Gaji. Satu menggunakan referensi Gaji s , dan yang lainnya menggunakan referensi Karyawan e .

Saat menjalankan s.mailCheck() , compiler melihat mailCheck() di kelas Gaji pada waktu kompilasi, dan JVM memanggil mailCheck() di kelas Gaji pada waktu proses.

mailCheck() pada e sangat berbeda karena e adalah referensi Karyawan. Ketika kompilator melihat e.mailCheck() , compiler melihat metode mailCheck() di kelas Karyawan.

Di sini, pada waktu kompilasi, kompilator menggunakan mailCheck() di Employee untuk memvalidasi pernyataan ini. Namun, pada saat dijalankan, JVM memanggil mailCheck() di kelas Gaji.

Perilaku ini disebut sebagai pemanggilan metode virtual, dan metode ini disebut sebagai metode virtual. Metode yang ditimpa dipanggil pada waktu proses, apa pun tipe data referensi yang digunakan dalam kode sumber pada waktu kompilasi.


java

  1. Operator Jawa
  2. Komentar Jawa
  3. Java untuk setiap Loop
  4. String Jawa
  5. Antarmuka Jawa
  6. Kelas Anonim Java
  7. Java mencoba-dengan-sumber daya
  8. Anotasi Jawa
  9. Pernyataan Jawa
  10. Vektor Jawa