Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中多态性的澄清?_Java_Polymorphism - Fatal编程技术网

Java中多态性的澄清?

Java中多态性的澄清?,java,polymorphism,Java,Polymorphism,为什么此代码中有错误?我如何解决此错误?您的calcBonus方法对Staff对象不可用。因为您使用多态性将partTimeStaff对象适配到Staff引用中,所以该对象只能调用Staff中存在的方法 我将尝试用一个简单的例子来解释: 假设我是汽车修理工。我对汽车了如指掌。我的一位客户给我带来了一辆福特金牛座汽车,并要求维修。我一般都知道如何保养汽车,所以没问题。但后来他让我修理车里的收音机,这是特定于特定品牌和型号的。我不知道怎么做。我对福特金牛座一无所知?。我知道所有的汽车都做什么,但我对

为什么此代码中有错误?我如何解决此错误?

您的calcBonus方法对Staff对象不可用。因为您使用多态性将partTimeStaff对象适配到Staff引用中,所以该对象只能调用Staff中存在的方法

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


假设我是汽车修理工。我对汽车了如指掌。我的一位客户给我带来了一辆福特金牛座汽车,并要求维修。我一般都知道如何保养汽车,所以没问题。但后来他让我修理车里的收音机,这是特定于特定品牌和型号的。我不知道怎么做。我对福特金牛座一无所知?。我知道所有的汽车都做什么,但我对特定类型的汽车一无所知。

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

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() {….........}
}
您告诉java,“me”是一个“Staff”对象,尽管实际上它是一个partTimeStaff对象。因此,编译器只知道“me”可以执行Staff函数CalcSalary,而不是partTimeStaff函数CalcBonus

为了使代码正常工作,您需要执行以下操作之一:

Staff me = new partTimeStaff()


后者是一个显式强制转换,告诉编译器me实际上是一个partTimeStaff对象。CalcBonus不是一个Staff方法。对象me虽然实例化为partTimeStaff的对象,但其类型为Staff,因此只能访问Staff方法。如果按以下方式添加强制转换,则它可以访问partTimeStaff方法:
partTimeStaff me.CalcBonus

Casting是将某个类或原始类型的内容转换为另一个类或原始类型。代码中的Casting在哪里?问题的标题和内容彼此不相关。@Arkadiy的可能副本那里没有Casting,但他需要使用它来使用CalcBonus,即partTimeStaffme.CalcBonus。@Madhoshi当然可以。希望它能帮助你+很好的解释。但公平地说,代码解决方案中的缺点实际上是Java中动态类型的一个例子,它打破了Java只是静态类型的说法。关于对象的实际类型保留了一些信息,这在一些简单的方法如getClass中是很清楚的。那么我如何解释使用该代码进行强制转换呢?@Madhoshi我不确定我是否理解你的问题,但在这段代码中,强制转换partTimeStaff me表示“me”实际上是partTimeStaff对象。这允许您在强制转换之后立即调用由函数调用指示的partTimeStaff方法。有关详细信息,您可能需要查看。@Madhoshi演员partTimeStaff me说,正如@ClearySpam23所说,me实际上是一个partTimeStaff对象,但它也会进行检查以确保。如果me被重新分配给某个不是partTimeStaff的Staff对象,则强制转换将导致程序抛出异常。
partTimeStaff me = new partTimeStaff()
Staff me = new partTimeStaff()
me.CalcSalary();
((partTimeStaff) me).CalcBonus();