我知道重载方法是在编译时根据调用方法的引用类型确定的,而重写方法是由引用调用方法的实际对象类型决定的,问题是为什么多态只关于覆盖而不是重写超载?
答案 0 :(得分:2)
使Java中的多态性成为可能的实现机制是基于其第一个参数的运行时类型的方法的动态调度(在调用a.method(b, c)
中,a
可以被认为是第一个参数方法)。因此,Java是一种单一调度 OOP语言。结果是所有其他参数都不参与此机制,并且它们的类型在编译时是静态确定的。例如,如果你有
class MyObject {
public boolean equals(MyObject o) { ... }
}
然后
MyObject m1 = new MyObject();
Object o = new MyObject();
System.out.println(m1.equals(o));
永远无法打印true
,因为您的方法未被调用。编译器看到一个调用MyObject.equals(Object)
并将其编译为继承方法Object.equals(Object)
的调用。运行时方法调度机制仅决定调用哪个重写方法equals(Object)
。
答案 1 :(得分:0)
多态性是指“同一形式”的方法在不同的上下文中表现出不同的行为。术语“相同形式”表示“相同的签名”。这意味着您无法将多态与重载方法联系起来,因为它们具有“不同的形式”。考虑它的另一种方法是 - 你需要一个类型和一个子类型来查看操作中的多态性 - 再次重载的方法是在单个类的上下文中定义的。
答案 2 :(得分:0)
这是出于技术原因。通常只在运行时分析this
指针作为方法的隐藏第一个参数,以确定要调用的方法。
当分析其他参数时,它也称为Multiple Dispatch。有几种语言本身支持多个调度。
答案 3 :(得分:-1)
你对此很困惑。
Overloading
指的是选择相同类(非层次结构)中具有相同名称但签名不同的方法之一。
根据父类继承的运行时类型,在同名方法中选择Overriding
如果您有一个基类和一个派生类,其方法具有相同的名称和签名,那么这是overriding
,并且在运行时确定正确的。
对于overloading
,编译器选择要使用的正确版本的方法,在相同类中可用。
无需查找运行时类型。编译器可以在编译时解决这个问题