华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java教程 >> 文章內(nèi)容

Java面向?qū)ο螅禾摲椒?/h1>
來(lái)源:中華考試網(wǎng)  [2016年2月17日]  【

我們將介紹在Java中,當(dāng)設(shè)計(jì)類時(shí),被重載的方法的行為怎樣影響多態(tài)性。

我們已經(jīng)討論了方法的重載,也就是子類能夠重載父類的方法。

當(dāng)子類對(duì)象調(diào)用重載的方法時(shí),調(diào)用的是子類的方法,而不是父類中被重載的方法。

要想調(diào)用父類中被重載的方法,則必須使用關(guān)鍵字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("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + 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;
   }
}

假設(shè)下面的類繼承Employee類:

/* 文件名 : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

現(xiàn)在我們仔細(xì)閱讀下面的代碼,嘗試給出它的輸出結(jié)果:

/* 文件名 : VirtualDemo.java */
public class VirtualDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

例子中,我們實(shí)例化了兩個(gè)Salary對(duì)象。一個(gè)使用Salary引用s,另一個(gè)使用Employee引用。

編譯時(shí),編譯器檢查到mailCheck()方法在Salary類中的聲明。

在調(diào)用s.mailCheck()時(shí),Java虛擬機(jī)(JVM)調(diào)用Salary類的mailCheck()方法。

因?yàn)閑是Employee的引用,所以調(diào)用e的mailCheck()方法則有完全不同的結(jié)果。

當(dāng)編譯器檢查e.mailCheck()方法時(shí),編譯器檢查到Employee類中的mailCheck()方法。

在編譯的時(shí)候,編譯器使用Employee類中的mailCheck()方法驗(yàn)證該語(yǔ)句, 但是在運(yùn)行的時(shí)候,Java虛擬機(jī)(JVM)調(diào)用的是Salary類中的mailCheck()方法。

該行為被稱為虛擬方法調(diào)用,該方法被稱為虛擬方法。

Java中所有的方法都能以這種方式表現(xiàn),借此,重寫的方法能在運(yùn)行時(shí)調(diào)用,不管編譯的時(shí)候源代碼中引用變量是什么數(shù)據(jù)類型。

責(zé)編:ljnbset
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
松滋市| 潞城市| 荃湾区| 兴国县| 安徽省| 建宁县| 磴口县| 山阳县| 剑阁县| 佛冈县| 三江| 留坝县| 沙洋县| 桂东县| 西乡县| 礼泉县| 赣榆县| 留坝县| 康保县| 宜黄县| 剑阁县| 富源县| 裕民县| 宁蒗| 宜良县| 邵东县| 渑池县| 新余市| 都昌县| 繁峙县| 北碚区| 曲阜市| 通州市| 佳木斯市| 西乌珠穆沁旗| 保靖县| 湾仔区| 香河县| 界首市| 登封市| 日土县|