Latest web development tutorials
×

Java หลักสูตร

Java หลักสูตร Java แนะนำโดยย่อ Java การกำหนดค่าการพัฒนาสภาพแวดล้อม Java พื้นฐานไวยากรณ์ Java วัตถุและการเรียน Java ชนิดข้อมูลพื้นฐาน Java ประเภทตัวแปร Java การปรับเปลี่ยน Java ผู้ประกอบการ Java โครงสร้างห่วง Java สาขาโครงสร้าง Java Number หมวดหมู่ Java Character หมวดหมู่ Java String หมวดหมู่ Java StringBuffer Java แถว Java วันที่เวลา Java นิพจน์ปกติ Java ทาง Java Stream,File,IO Java Scanner หมวดหมู่ Java การจัดการข้อยกเว้น

Java เชิงวัตถุ

Java สืบทอด Java Override/Overload Java polymorphism Java ระดับนามธรรม Java บรรจุภัณฑ์ Java อินเตอร์เฟซ Java บรรจุภัณฑ์

Java การสอนที่ทันสมัย

Java โครงสร้างข้อมูล Java คอลเลกชันกรอบ Java ยาชื่อสามัญ Java การทำให้เป็นอันดับ Java เขียนโปรแกรมเครือข่าย Java ส่ง Email Java การเขียนโปรแกรมแบบมัลติเธรด Java Appletรากฐาน Java เอกสารความคิดเห็น Java ตัวอย่าง Java 8 คุณสมบัติใหม่ Java MySQL สัมพันธ์

Java polymorphism

ความแตกต่างคือความสามารถที่จะมีพฤติกรรมเดียวกันของจำนวนของรูปแบบที่แตกต่างกันหรือลักษณะทางสัณฐานวิทยา

polymorphism เป็นวัตถุของหลายรูปแบบของการแสดงออก

ในความเป็นจริงเช่นเรากดปุ่ม F1 กับการกระทำนี้

  • หากปัจจุบันในอินเตอร์เฟซแบบ pop-up แฟลชจะเป็นเอกสาร 3 ความช่วยเหลือ
  • หากปัจจุบันอยู่ในดีดออกช่วยเหลือพระวจนะของ Word;
  • ในหน้าต่างแบบผุดขึ้นคือการช่วยเหลือและการสนับสนุนของ Windows

เหตุการณ์เดียวกันบนวัตถุที่แตกต่างกันจะให้ผลลัพธ์ที่แตกต่างกัน

สามเงื่อนไขที่จำเป็นสำหรับการดำรงอยู่ของความแตกต่างนี้:

  • สืบทอด
  • เขียนใหม่
  • อ้างอิงแม่เพื่อวัตถุประเภทรอง

ตัวอย่างเช่น:

Parent p = new Child();

เมื่อใช้วิธี polymorphic เรียกวิธีการตรวจสอบก่อนว่ามีวิธีการของระดับผู้ปกครองและหากไม่ได้รวบรวมข้อผิดพลาดนั้นถ้ามีอีกครั้งเรียกเมธอด subclass เดียวกัน

ผลประโยชน์ของรัฐหลาย: คุณสามารถทำให้โปรแกรมส่วนขยายที่ดีและสามารถจัดการกับวัตถุทั้งหมดที่พบบ่อยของการเรียน

นำเสนอต่อไปนี้เป็นของรัฐหลายรายละเอียดเช่นดูหมายเหตุ:

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

โปรแกรมข้างต้นผลลัพธ์คือ:

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

วิธีเสมือน

เราจะมาแนะนำใน Java เมื่อออกแบบการดำเนินการระดับเป็นวิธีการแทนที่ของวิธีการที่มันมีผลต่อความแตกต่าง

เราได้กล่าวแล้ววิธีการแทนที่ซึ่งเป็น subclass สามารถแทนที่ระดับผู้ปกครอง

เมื่อมีวัตถุประเภทรองเรียกวิธีการแทนที่เรียกวิธี subclass มากกว่าวิธีการเรียนผู้ปกครองแทนที่

ที่จะเรียกวิธีการเรียนของผู้ปกครองที่มีการแทนที่คุณจะต้องใช้ซุปเปอร์คำหลัก

/* 文件名 : 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, และอื่น ๆ โดยใช้การอ้างอิงพนักงาน E

  • เมื่อโทร s.mailCheck () คอมไพเลอร์ที่พบ Mailcheck ที่รวบรวมเวลา () ในระดับเงินเดือนขั้นตอนการดำเนิน JVM เรียกระดับเงินเดือน Mailcheck ()

  • เมื่อโทร s.mailCheck () โปรแกรม Java Virtual Machine (JVM) เพื่อเรียกเงินเดือนที่ต้องการเรียน Mailcheck () วิธีการ

  • เพราะ E คือการอ้างอิงของพนักงานเพื่อให้ผู้โทร E Mailcheck () วิธีการเมื่อคอมไพเลอร์จะไปดูระดับพนักงาน Mailcheck () วิธีการ

  • ที่รวบรวมเวลาคอมไพเลอร์ที่ใช้ในระดับพนักงาน Mailcheck () วิธีการในการตรวจสอบคำสั่ง แต่ในเวลาทำงานโปรแกรม Java Virtual Machine (JVM) เรียกว่าเงินเดือนระดับ Mailcheck () วิธีการ

ตลอดกระบวนการดังกล่าวข้างต้นจะเรียกว่าเป็นวิธีการที่เสมือนสายซึ่งเรียกว่าวิธีการที่เสมือนจริง

ทุกวิธี Java สามารถทำงานในลักษณะนี้จึงสามารถแทนที่วิธีการที่เรียกว่าในเวลาทำงานโดยไม่คำนึงถึงรหัสที่มาเมื่อรวบรวมตัวแปรอ้างอิงสิ่งที่ประเภทของข้อมูล