Latest web development tutorials

Java полиморфизм

Полиморфизм является возможность иметь такое же поведение ряда различных форм или морфологии.

Полиморфизм является объектом многих форм выражения.

В действительности, такие, как мы нажать клавишу F1 для этого действия:

  • Если ток в всплывающем интерфейсе Flash-AS является 3 справочной документации;
  • Если ток в выталкивания справки Слово Слово;
  • В всплывающем окон справки и поддержки Windows.

То же событие на различных объектах будет производить различные результаты.

Три необходимые условия для существования полиморфизма:

  • унаследовать
  • перезапись
  • Родитель ссылка на объект подкласса

Например:

Parent p = new Child();

При использовании полиморфного метода вызывается способом, сначала проверьте, есть ли метод родительского класса, и если нет, то ошибка компиляции, если есть, опять же, тот же метод вызывается подкласс.

Multi-государственные пособия: Вы можете сделать программу хорошее расширение, и может обрабатывать все общие объекты класса.

Следующая презентация является многопрофильным Состояние деталей экземпляра см Примечание:

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, при проектировании класса действия переопределяется метод, как это влияет на полиморфизм.

Мы уже обсуждали метод переопределения, который является подкласс может переопределить родительский класс.

Когда объект подкласса вызывает переопределенный метод, вызовите метод подкласса, а не родительский класс Перегруженные методы.

Для того, чтобы вызвать метод родительского класса перекрыт, то вы должны использовать ключевое слово супер.

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

Если предположить, что следующий класс наследует класс Employee:

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

Примеры Аналитические

  • Instance, инстанцирует два объекта Зарплата: Заработная плата использование ссылки на S, а другой с помощью ссылки Сотрудник е.

  • При вызове s.mailCheck (), компилятор нашел MailCheck во время компиляции () в классе заработной платы, процесс реализации виртуальной машины Java называет класс Зарплата MailCheck ().

  • При вызове s.mailCheck (), Java Virtual Machine (JVM) для вызова метода классов Зарплата MailCheck ().

  • Поскольку е ссылка Сотрудник, поэтому адрес вызывающего абонента MailCheck () метод, когда компилятор будет идти класс Employee выглядит метод MailCheck ().

  • Во время компиляции, компилятор использует метод класса Employee MailCheck (), чтобы проверить утверждение, но во время выполнения, Java Virtual Machine (JVM) называется метод Зарплатный класс MailCheck ().

На протяжении всего процесса выше она называется виртуальным вызовы методов, которая называется виртуальный метод.

Все методы Java могут вести себя подобным образом, поэтому, может переопределить метод, называемый во время выполнения, независимо от исходного кода при компиляции ссылочную переменную, какой тип данных.