本文主要是介绍java编程艺术 高永强_8.3 多态应用实例--计算雇员工资,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
8.3 多态应用实例--计算雇员工资
图8.4表示了一个计算雇员工资的继承图。
图8.4 计算雇员工资继承图让我们按照这个图示来演示多态的应用。应用实例中仅包括了最基本的数据和方法,用来解释多态的应用。在实际应用中,添加其他数据和方法应当不难。
//这个程序存在本书配套资源目录Ch8名为
Employee.java
publicclassEmployee {
privateString name;
publicEmployee(String name ) {
this.name = name;
}
publicString getName() {returnname; }
publicdoubleearnings(){return0.0;}//多态方法接口
}
在这个超类中,定义了两个用来实现多态的接口方法toString()和earnings()。要求子类覆盖这两个方法,来执行其对工资的计算。值得一提的是,方法toString()并没有在超类Employee中显性地指定为多态接口方法,但依然可以实现多态调用。首先,我们要感谢所有类的祖先Object,它向所有类提供了toString()方法,以期覆盖。所以编译器不会产生语法错误信息。其次,虽然在Employee中没有提供toString(),JVM也不会向上执行Object的toString(),而是执行调用这个方法所引用的对象的toString(),这恰恰是我们所期望的。这个功能我们称之为隐含多态接口方法。它相当于在Employee中存在这样一个方法:publicString toString() {returnnull; }
或者将Employee改写为抽象超类并且定义一个抽象方法toString(),如:publicabstractclassEmployee {
...
publicabstractString toString();
}
可以得到相同的效果。
如下类Manager继承Employee并覆盖多态接口方法://这个程序存在本书配套资源目录Ch8名为Manager.java
//Manager class derived from Employee
publicclassManagerextendsEmployee {
protecteddoublesalary;
publicManager( String name,doublesalary) {
super( name );//调用超类构造器
this.salary = salary;
}
publicdoubleearnings() {returnsalary; }//覆盖这个方法实现多态
publicString toString() {//上同
return"Manager: "+ getName();//调用继承的方法getName()
}
}
在对toString()的覆盖中,通过调用getName()返回代表Manager名字的字符串。
SeniorManager类继承了Manager,也分别覆盖了超类Employee规定的两个接口方法。如://这个程序存在本书配套资源目录Ch8名为SeniorManager.java
//SeniorManager class derived from Manager
publicfinalclassSeniorManagerextendsManager {
privatedoublemeritPay;
publicSeniorManager( String name,doublesalary,doublemeritPay) {
super( name , salary);//调用超类构造器
this.meritPay = meritPay;
}
publicdoubleearnings() {returnsalary + meritPay; }
//覆盖这个方法实现多态
publicString toString() {//上同
return"Senior Manager: "+ getName();
}
}
***,在这个实例中,RegularWorker类继承了Employee,并且覆盖指定的接口方法://这个程序存在本书配套资源目录Ch8名为RegularWorker.java
//RegularWorker class derived from Employee
publicclassRegularWorkerextendsEmployee {
protecteddoublesalary, overtimePay;
publicRegularWorker( String name,doublesalary,doubleovertimePay)
{
super( name );//调用超类构造器
this.salary = salary;
this.overtimePay = overtimePay;
}
publicdoubleearnings() {returnsalary + overtimePay; }
//覆盖这个方法实现多态
publicString toString() {//上同
return"Regular worker: "+ getName();
}
}
用来实行多态的驱动类的代码如下://这个程序存在本书配套资源目录Ch8名为PolymorphismApp.java
importjavax.swing.JOptionPane;
importjava.text.DecimalFormat;
publicclassPolymorphismApp {
publicstaticvoidmain( String args[] ) {
Employee[] ref =newEmployee[3];// 超类多态引用数组
String output ="";
Manager manager =newManager("Wang",5800.00);
SeniorManager senior =newSeniorManager("Smith",6250.0,1500.0);
RegularWorker regular =newRegularWorker("Lee",2980.00,270.0);
DecimalFormat precision2 =newDecimalFormat("0.00");
ref[0] = manager;//超类引用manager
ref[1] = senior;//超类引用senior manager
ref[2] = regular;//超类引用regular worker
for(inti =0; i <3; i++)//循环多态产生输出信息
output += ref[i].toString() +" earned $"+
precision2.format( ref[i].earnings() ) +"\n";
JOptionPane.showMessageDialog(null, output,//输出这些信息
"Demonstrating Polymorphism",
JOptionPane.INFORMATION_MESSAGE );
}
}
在这个驱动程序中,分别创建了三个不同类的对象,利用一个具有3个单元的超类引用数组,分别储存这三个对象,实现向上转型或超类引用。然后利用循环语句和调用toString() 和earnings()方法,多态输出不同对象的名字和工资信息。其运行结果如图8.5所示。
图8.5 多态应用实例运行结果
【责任编辑:云霞 TEL:(010)68476606】
点赞 0
这篇关于java编程艺术 高永强_8.3 多态应用实例--计算雇员工资的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!