Java中多态性的澄清?

时间:2014-06-19 16:19:30

标签: java polymorphism

public class DeliverySystem {

     public static void main(String[] args) {
        Staff me = new partTimeStaff()
    me.CalcSalary();
    me.CalcBonus();
     }
}

class partTimeStaff extends Staff{
    public void CalcBonus(){..........}
}


class Staff{
        public void CalcSalary() {….........}
}

为什么此代码中存在错误,如何解决此错误?

3 个答案:

答案 0 :(得分:2)

calcBonus()对象无法使用Staff方法。因为您使用多态来使partTimeStaff对象适合Staff引用,所以该对象只能调用Staff中存在的方法。

我将尝试用一个简单的例子来解释它:

假设我是一名汽车修理工。我对汽车一无所知。我的一位客户给我带了他的车(福特金牛座)并要求将其送去维修。我知道如何维修汽车,所以这没问题。但后来他要我修理汽车中的收音机,这是特定的制造和型号。我不知道该怎么做。我对福特Tauruses(Tauri?)一无所知。我知道所有汽车的用途,但我对汽车的具体类型一无所知。

答案 1 :(得分:2)

Java是一种静态类型语言。这意味着它必须知道在编译时可用的方法和变量。当你这样做

Staff me = new partTimeStaff()

你告诉java我'我'是一个'员工'对象(尽管实际上它是partTimeStaff对象)。因此,编译器只知道' me'可以执行Staff函数(CalcSalary),而不是partTimeStaff函数(CalcBonus)。

为了使代码能够正常工作,您需要做:

partTimeStaff me = new partTimeStaff()

Staff me = new partTimeStaff()
me.CalcSalary();
((partTimeStaff) me).CalcBonus();

后者是一个显式的强制转换(告诉编译器我实际上是一个partTimeStaff对象

答案 2 :(得分:0)

CalcBonus不是员工的方法。对象me虽然被实例化为partTimeStaff的对象,但它具有Staff类型,因此只能访问Staff方法。如果你添加一个演员如下,它可以访问partTimeStaff方法: ((partTimeStaff) me).CalcBonus();