Latest web development tutorials

polimorfismo de Java

El polimorfismo es la capacidad de tener el mismo comportamiento de un número de diferentes formas o morfología.

El polimorfismo es el objeto de muchas formas de expresión.

En realidad, como la que pulse la tecla F1 para esta acción:

  • Si la corriente en la interfaz emergente de Flash es como documentación 3 ayuda;
  • Si la corriente está en la expulsión de la Ayuda de Word Palabra;
  • En las ventanas pop-up es de ayuda y soporte técnico de Windows.

El mismo evento en diferentes objetos producirá resultados diferentes.

Tres condiciones necesarias para la existencia de polimorfismo:

  • heredar
  • volver a escribir
  • Padres referencia a un objeto de la subclase

Por ejemplo:

Parent p = new Child();

Cuando se utiliza el método polimórfico llama a la forma, primero comprobar si existe el método de la clase padre, y si no, el error de compilación, si hay, de nuevo, llama a la misma subclase método.

beneficios en varios estados: Puede hacer que el programa de una buena extensión, y puede manejar todos los objetos comunes de la clase.

La siguiente presentación es un detalles de la instancia multi-estatales, véase la nota:

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

El programa anterior, la salida es:

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

métodos virtuales

Vamos a introducir en Java, en el diseño de la acción de clase es método reemplazado de cómo afecta el polimorfismo.

Ya hemos discutido el método de reemplazo, que es una subclase puede anular la clase padre.

Cuando un objeto subclase llama al método reemplazado, llame al método subclase, en lugar de la clase padre métodos sustituidos.

Para llamar se anula el método de la clase padre, debe utilizar la palabra clave 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;
   }
}

Suponiendo que la siguiente clase hereda clase 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;
   }
}

Ahora leemos el siguiente código intenta dar a su salida:

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

Los ejemplos anteriores resultados compilados son los siguientes:

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

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

Ejemplos de análisis

  • Ejemplo, una instancia de dos objetos Salario: Salario uso una referencia a s, y la otra utilizando referencias a los empleados e.

  • Al llamar s.mailCheck (), el compilador encuentra Mailcheck en tiempo de compilación () en la clase de sueldos, el proceso de implementación de la JVM llama a la clase Salario Mailcheck ().

  • Al llamar s.mailCheck (), Java Virtual Machine (JVM) para llamar al método clases de sueldos Mailcheck ().

  • Dado que el correo es la referencia de los empleados, por lo que el método electrónico de la persona que llama Mailcheck () cuando el compilador irá clase Employee mira método Mailcheck ().

  • En tiempo de compilación, el compilador utiliza el método de la clase Empleado Mailcheck () para verificar la declaración, pero en tiempo de ejecución, Java Virtual Machine (JVM) se llama al método Salario clase Mailcheck ().

A lo largo del proceso anterior se le llama un virtual llamadas de método, que se llama un método virtual.

Todos los métodos de Java pueden comportarse de esta manera, por lo tanto, puede reemplazar el método llamado en tiempo de ejecución, independientemente del código fuente al compilar una variable de referencia el tipo de datos.