Latest web development tutorials

Javaの多型

多型は異なる形または形態の数の同じ動作を持っている能力です。

多型は、式の多くの形態の目的です。

実際には、我々はこのアクションにF1キーを押すと、このような:

  • フラッシュポップアップインタフェースの電流は3ヘルプドキュメントASであれば、
  • 現在は、イジェクトWordワードのヘルプにある場合は、
  • ポップアップのWindowsでは、Windowsのヘルプとサポートです。

異なるオブジェクト上の同じイベントが異なる結果を生成します。

多型の存在のための3つの必要条件:

  • 受け継ぎます
  • リライト
  • サブクラスオブジェクトへの親の参照

例えば:

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

上記のプログラムは、出力は次のようになります。

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

仮想メソッド

我々は、設計、クラスアクションは、それが多型をどのように影響するかの方法をオーバーライドされたときに、Javaでご紹介します。

我々はすでにサブクラスは親クラスをオーバーライドすることができているオーバーライドメソッドを、説明してきました。

サブクラスオブジェクトはオーバーライドされたメソッドを呼び出すと、サブクラスのメソッドではなく、親クラスオーバーライドされたメソッドを呼び出します。

親クラスのメソッドをオーバーライドする呼び出すには、キーワード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;
   }
}

次のクラスと仮定すると、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

分析例

  • 例えば、二つのオブジェクトの給与をインスタンス化:給与使用sの参照、および他の使用して、従業員の参照を電子。

  • s.mailCheck()を呼び出す場合、コンパイラは(コンパイル時にMAILCHECKを発見した)給与クラスで、実装プロセスJVMは、給与クラスMAILCHECK()を呼び出します。

  • s.mailCheck()を呼び出すときに、Java仮想マシン(JVM)は、給与クラスMAILCHECK()メソッドを呼び出します。

  • eは従業員の参照であるため、コンパイラは、Employeeクラスを移動します発信者の電子MAILCHECK()メソッドは、MAILCHECK()メソッドを探しますので。

  • コンパイル時に、コンパイラは、ステートメントを確認するために、EmployeeクラスMAILCHECK()メソッドを使用しますが、実行時に、Java仮想マシン(JVM)は、給与クラスMAILCHECK()メソッドと呼ばれています。

上記のプロセスを通して、それは仮想メソッドと呼ばれる仮想メソッドの呼び出しを、と呼ばれています。

データの参照変数種類をコンパイルするときに、すべてのJavaメソッドに関係なく、ソースコードのため、実行時に呼び出されるメソッドをオーバーライドすることができ、このように動作することができます。