Latest web development tutorials

جافا تعدد الأشكال

تعدد الأشكال هو القدرة على الحصول على نفس السلوك من عدد من الأشكال المختلفة أو شكلها.

تعدد الأشكال هو موضوع العديد من أشكال التعبير.

في الواقع، مثل نضغط على مفتاح F1 لهذا العمل:

  • إذا كان التيار في واجهة المنبثقة فلاش هو AS الوثائق 3 مساعدة؛
  • إذا كان التيار في إخراج تعليمات Word كلمة؛
  • في ويندوز منبثقة هو ويندوز التعليمات والدعم.

فإن نفس الحدث على كائنات مختلفة تنتج نتائج مختلفة.

ثلاثة شروط ضرورية لوجود تعدد الأشكال:

  • وراثة
  • كتابة
  • المرجعية الأم إلى كائن فئة فرعية

على سبيل المثال:

Parent p = new Child();

عند استخدام أسلوب متعدد الأشكال يدعو الطريق، أولا التحقق ما إذا كان هناك طريقة فئة الأصل، وإذا لم يكن كذلك، الخطأ مترجم، وإذا كان هناك، مرة أخرى، يدعو نفس طريقة فرعية.

فوائد متعددة الدولة: يمكنك جعل البرنامج امتدادا جيد، ويمكن التعامل مع كل الكائنات المشتركة للطبقة.

العرض التالي هو متعدد الدولة تفاصيل سبيل المثال، انظر ملاحظة:

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("看家");  
    }  
}  

البرنامج المذكور أعلاه، والناتج هو:

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

طرق افتراضية

وسوف نقدم في جاوة، عند تصميم الطبقة العمل هو الأسلوب متجاوزة لكيف يؤثر تعدد الأشكال.

وقد سبق طريقة تجاوز، وهي فئة فرعية يمكن تجاوز الفئة الأصل.

عند استدعاء كائن فئة فرعية طريقة متجاوزة، استدعاء الأسلوب فرعية، بدلا من الفئة الأصل أساليب متجاوزة.

للاتصال وتجاوز أسلوب فئة الوالدين، يجب عليك استخدام فائقة الكلمات الرئيسية.

/* 文件名 : 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;
   }
}

وإذا افترضنا أن الطبقة التالية يرث فئة الموظف:

/* 文件名 : 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;
   }
}

الآن نقرأ التعليمات البرمجية التالية يحاول أن يعطي انتاجها:

/* 文件名 : 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();
    }
}

الأمثلة المذكورة أعلاه جمعت النتائج على النحو التالي:

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

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

أمثلة تحليلية

  • سبيل المثال، مثيل كائنين الراتب: الراتب استخدام إشارة إلى الصورة، واستخدام المراجع الموظف غيرها من المناسبات.

  • عندما يدعو s.mailCheck ()، وجد المترجم mailCheck في وقت الترجمة () في فئة الراتب، عملية التنفيذ JVM تدعو الطبقة الراتب mailCheck ().

  • عندما يدعو s.mailCheck ()، آلة جافا الافتراضية (JVM) لاستدعاء أسلوب الطبقات الراتب mailCheck ().

  • لأن البريد هو مرجع الموظف، لذلك ه المتصل mailCheck () طريقة عندما المجمع لن يذهب فئة الموظف يبدو mailCheck طريقة ().

  • في وقت الترجمة، يستخدم مترجم أسلوب فئة الموظف mailCheck () للتحقق من البيان، ولكن في وقت التشغيل، ويسمى آلة جافا الافتراضية (JVM) فئة طريقة الراتب mailCheck ().

طوال العملية المذكورة أعلاه ويسمى استدعاءات الأسلوب الظاهري، وهو ما يسمى أسلوب ظاهري.

ويمكن لجميع أساليب جافا تتصرف على هذا النحو، لذلك، يمكن تجاوز أسلوب دعا في وقت التشغيل، بغض النظر عن رمز المصدر عند تجميع متغير إشارة نوع البيانات.