华南俳烁实业有限公司

考試首頁(yè) | 考試用書 | 培訓(xùn)課程 | 模擬考場(chǎng) | 考試論壇  
全國(guó)  |             |          |          |          |          |         
  當(dāng)前位置:計(jì)算機(jī)等級(jí) > 二級(jí)考試 > Java語(yǔ)言程序設(shè)計(jì) > 考試輔導(dǎo) > 文章內(nèi)容
  

全國(guó)計(jì)算機(jī)等級(jí)考試Java語(yǔ)言程序設(shè)計(jì)輔導(dǎo)(59)

中華IT學(xué)院   【 】  [ 2016年2月22日 ]

我們將介紹在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ù)類型。

分享到:
本文糾錯(cuò)】【告訴好友】【打印此文】【返回頂部
將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動(dòng)訪問(wèn)考試網(wǎng) | 復(fù)制本頁(yè)地址,傳給QQ/MSN上的好友 | 申請(qǐng)鏈接 | 意見留言 TOP
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導(dǎo)航  考試論壇
Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved
新兴县| 莆田市| 龙门县| 肃北| 左权县| 开化县| 东丰县| 沧州市| 南华县| 凤凰县| 高淳县| 育儿| 紫金县| 浙江省| 牙克石市| 巨鹿县| 沙雅县| 金华市| 清丰县| 肃南| 建平县| 荥经县| 铜陵市| 湘乡市| 迭部县| 陇南市| 镇康县| 噶尔县| 郁南县| 嘉鱼县| 婺源县| 莱阳市| 平遥县| 扎赉特旗| 辉南县| 通道| 乐业县| 神农架林区| 贵定县| 绥化市| 盈江县|