Latest web development tutorials

polimorfisme java

Polimorfisme adalah kemampuan untuk memiliki perilaku yang sama dari sejumlah bentuk yang berbeda atau morfologi.

Polimorfisme adalah obyek berbagai bentuk ekspresi.

Pada kenyataannya, seperti yang kita tekan tombol F1 untuk tindakan ini:

  • Jika saat ini dalam antarmuka flash pop-up adalah AS 3 dokumentasi bantuan;
  • Jika saat ini di eject Firman Word bantuan;
  • Pada Windows pop-up adalah Windows Help and Support.

Acara yang sama pada objek yang berbeda akan menghasilkan hasil yang berbeda.

Tiga kondisi yang diperlukan untuk keberadaan polimorfisme:

  • mewarisi
  • menulis kembali
  • referensi induk ke objek subclass

Sebagai contoh:

Parent p = new Child();

Bila menggunakan metode polimorfik panggilan jalan, periksa dulu apakah ada metode kelas induk, dan jika tidak, kesalahan compiler, jika ada, lagi, panggilan metode yang sama subclass.

manfaat multi-state: Anda dapat membuat program ekstensi yang baik, dan dapat menangani semua benda umum dari kelas.

Presentasi berikut adalah multi-negara rincian misalnya, lihat Catatan:

public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 catchMouse
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}

abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}  

Program di atas, output adalah:

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

metode virtual

Kami akan memperkenalkan di Jawa, ketika merancang class action adalah metode ditimpa dari bagaimana hal itu mempengaruhi polimorfisme.

Kita telah membahas metode override, yang merupakan subclass dapat menimpa kelas induk.

Jika benda subclass memanggil metode ditimpa, memanggil metode subclass, bukan kelas induk metode ditimpa.

Untuk memanggil metode kelas induk ditimpa, Anda harus menggunakan super kata kunci.

/* 文件名 : 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("Employee 构造函数");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public void mailCheck() {
      System.out.println("邮寄支票给: " + 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;
   }
}

Dengan asumsi kelas berikut mewarisi kelas karyawan:

/* 文件名 : Salary.java */
/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; // 全年工资
   public Salary(String name, String address, int number, double salary) {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck() {
       System.out.println("Salary 类的 mailCheck 方法 ");
       System.out.println("邮寄支票给:" + getName()
       + " ,工资为:" + salary);
   }
   public double getSalary() {
       return salary;
   }
   public void setSalary(double newSalary) {
       if(newSalary >= 0.0) {
          salary = newSalary;
       }
   }
   public double computePay() {
      System.out.println("计算工资,付给:" + getName());
      return salary/52;
   }
}

Sekarang kita membaca kode berikut mencoba memberikan output:

/* 文件名 : VirtualDemo.java */
public class VirtualDemo {
   public static void main(String [] args) {
      Salary s = new Salary("员工 A", "北京", 3, 3600.00);
      Employee e = new Salary("员工 B", "上海", 2, 2400.00);
      System.out.println("使用 Salary 的引用调用 mailCheck -- ");
      s.mailCheck();
      System.out.println("\n使用 Employee 的引用调用 mailCheck--");
      e.mailCheck();
    }
}

Contoh di atas hasil disusun adalah sebagai berikut:

Employee 构造函数
Employee 构造函数
使用 Salary 的引用调用 mailCheck -- 
Salary 类的 mailCheck 方法 
邮寄支票给:员工 A ,工资为:3600.0

使用 Employee 的引用调用 mailCheck--
Salary 类的 mailCheck 方法 
邮寄支票给:员工 B ,工资为:2400.0

contoh Analytical

  • Misalnya, instantiate dua benda Gaji: penggunaan Gaji referensi ke s, dan menggunakan referensi Karyawan yang lain e.

  • Saat memanggil s.mailCheck (), compiler menemukan MAILCHECK pada waktu kompilasi () di kelas Gaji, proses implementasi JVM panggilan kelas Gaji MAILCHECK ().

  • Saat memanggil s.mailCheck (), Java Virtual Machine (JVM) untuk memanggil metode kelas Gaji MAILCHECK ().

  • Karena e adalah referensi Karyawan, sehingga e pemanggil MAILCHECK () metode ketika compiler akan pergi kelas karyawan terlihat metode MAILCHECK ().

  • Pada waktu kompilasi, compiler menggunakan metode kelas Karyawan MAILCHECK () untuk memverifikasi pernyataan, tetapi pada waktu berjalan, Java Virtual Machine (JVM) disebut MAILCHECK () metode kelas Gaji.

Sepanjang proses di atas disebut metode virtual panggilan, yang disebut metode virtual.

Semua metode Java dapat berperilaku dengan cara ini, oleh karena itu, dapat menimpa metode yang disebut pada waktu berjalan, terlepas dari kode sumber ketika kompilasi variabel referensi jenis data.