我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。
让我们先更正此语句。变量
ah是类型的引用,
Animal并且该语句
newHorse()创建类型的实例
Horse并将其分配给
Animal引用。
现在,术语已经很清楚了,这种行为是可以预期的,并被称为运行类型多态或动态方法分派。在编译时,
eat()将基于的引用类型进行解析
Animal,但是在运行时,将被调用的方法基于
实例 类型来进行解析
Horse。
当我有一个引用对象类型的泛型引用变量类型时,如何确定编译器将要调用哪种方法?
您可以按照以下简单步骤 *** 作:
- 检查被调用的方法。
ah.eat()
正在调用方法eat
。 - 查看父类和子类中是否都存在签名完全相同的方法(例外是返回类型协方差)。(是否已覆盖方法?)
- 检查参考类型。在中
Animal ah = new Horse()
,引用类型是Animal
父类 - 检查实例类型。在中
Animal ah = new Horse()
,实例类型是Horse
子类。
如果满足上述所有条件,则您正在查看运行类型多态性,并且将从子类中调用该方法。在任何其他情况下,将基于引用类型解析要调用的方法。
还需要了解子类从其父类继承方法。假设您
public void eat()从
Horse类中删除了该方法,那么您将不再 覆盖
该
eat()方法;然而,
public void eat(String s)在方法
Horse仍称 重载
继承
eat的方法
Animal。接下来,让我们在中添加一个
public void eat(Strings)方法
Animal。有了这个此外,你现在 超载 的
eat在方法
Animal和 Overrding
在它
Horse的类。无论您如何更改代码,上面提到的4个步骤都将始终帮助您确定将调用哪种方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)