Polimorfisme Java
Polymorphism ialah keupayaan tingkah laku yang sama untuk mempunyai pelbagai manifestasi atau bentuk yang berbeza.
Polymorphism ialah penjelmaan pelbagai ekspresi objek.
Tiga syarat yang diperlukan untuk kewujudan polimorfisme:Sebenarnya, sebagai contoh, apabila kita menekan kekunci F1:
Peristiwa yang sama akan menghasilkan hasil yang berbeza apabila ia berlaku pada objek yang berbeza.
Jika dokumen bantuan AS 3 muncul pada masa ini dalam antara muka Flash; 🎜 >
- Jika Word Help muncul pada masa ini di bawah Word;
- Jika ia muncul di bawah Windows, Bantuan dan Sokongan Windows akan muncul.
- Warisan
- Tulis Semula
- Rujukan kelas induk menunjuk ke objek subkelas
Parent p = new Child();Apabila memanggil kaedah secara polimorf, semak dahulu sama ada kelas induk There adakah kaedah ini, jika tidak, ralat kompilasi berlaku jika ada, maka panggil kaedah dengan nama yang sama dalam subkelas. Faedah polimorfisme: Ia membolehkan atur cara dikembangkan dengan baik dan boleh mengendalikan objek dari semua kelas secara universal. Berikut ialah demonstrasi contoh polimorfik Sila lihat ulasan untuk butiran:
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("看家"); } }Laksanakan program di atas dan hasil keluarannya ialah:
吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠
Kaedah mayaKami akan memperkenalkan cara kelakuan kaedah yang ditindih mempengaruhi polimorfisme apabila mereka bentuk kelas dalam Java. Kami telah membincangkan penggantian kaedah, iaitu subkelas boleh mengatasi kaedah kelas induk. Apabila objek subkelas memanggil kaedah ganti, kaedah subkelas dipanggil, bukan kaedah ganti dalam kelas induk. Untuk memanggil kaedah yang diganti dalam kelas induk, anda mesti menggunakan kata kunci super.
/* 文件名 : 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; } }Anggapkan bahawa kelas berikut mewarisi kelas Pekerja:
/* 文件名 : 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 kod berikut dengan teliti dan cuba memberikan outputnya:
/* 文件名 : 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 kompilasi dan menjalankan keputusan Seperti berikut:
Employee 构造函数 Employee 构造函数 使用 Salary 的引用调用 mailCheck -- Salary 类的 mailCheck 方法 邮寄支票给:员工 A ,工资为:3600.0 使用 Employee 的引用调用 mailCheck-- Salary 类的 mailCheck 方法 邮寄支票给:员工 B ,工资为:2400.0Contoh analisis
- Dalam contoh, dua objek Gaji dijadikan instantiated: satu menggunakan Gaji untuk rujukan, dan satu lagi menggunakan Pekerja untuk rujukan e.
- Apabila s.mailCheck() dipanggil, pengkompil mendapati bahawa mailCheck() berada dalam kelas Gaji semasa penyusunan, dan proses pelaksanaan JVM memanggil mailCheck() kelas Gaji.
- Apabila memanggil s.mailCheck(), Mesin Maya Java (JVM) memanggil kaedah mailCheck() kelas Gaji.
- Oleh kerana e adalah rujukan kepada Pekerja, apabila memanggil kaedah mailCheck() e, pengkompil akan pergi ke kelas Pekerja untuk mencari kaedah mailCheck().
- Pada masa penyusunan, pengkompil menggunakan kaedah mailCheck() dalam kelas Pekerja untuk mengesahkan pernyataan, Tetapi apabila berjalan, Mesin Maya Java (JVM) memanggil kaedah mailCheck() dalam kelas Gaji.