动态绑定条件 Java



我的教授已经给出了一些关于何时在java中发生动态绑定的信息,但是在阅读了堆栈溢出和其他网站上的许多帖子后,我不确定我是否得到了正确的信息。我的教授在他的演讲中指出,在以下情况下需要动态绑定:

1(一个变量被声明为有一个超类作为其类型,并且

2(有多个可能的多态方法可以在变量的类型及其子类之间运行

我不确定条件 1(,因为我在任何地方都读到状态,每当有方法覆盖时都需要动态绑定。 举个例子:

public class Polygon{
public void getPerimeter(){
System.out.println("Polygon method")
}
}
public class Rectangle() extends Polygon{
public void getPerimeter(){
System.out.println("Rectangle method")
}
}

public static void main(String[] args){
Rectangle a = new Rectangle();
a.getPerimeter();
}

此代码是否需要动态绑定?矩形不是超类,因此不满足条件 1(。但是,矩形中的方法将覆盖超类多边形中的方法。编译器如何知道要运行哪个方法?

在Java中,多态性由两个方面组成:

类型
  • 继承:使用超类型类型的引用指向子类型类型的实例(例如:Polygon p = new Rectangle()(。
  • 动态绑定:根据对象的实际类型,在运行时将方法签名绑定到方法实现(例如:对于p.getPerimeter(),调用对实际p类型最具体的getParamater方法(。

由于在您的示例中,您在定义Rectangle时没有使用超类类型,因此您没有使用多态性。

如果要使用多态性,请按如下所示重构代码:

public static void main(String[] args) {
// using a supertype reference
Polygon a = new Rectangle();
/** 
there are two methods available here, the one inherited from Polygon and 
the one Rectangle overrides. Dynamic binding ensures the right method gets 
picked up at runtime, based on the actual type of the Polygon object 
(which in this case in Rectangle)
*/
a.getPerimeter();
}

您可能会争辩说,即使在您的示例中也会发生动态绑定(因为正确的实现在运行时被拾取(,但以这种方式使用它会违背动态绑定的目的(因为如果您将引用定义为与实际对象相同的类型,则最终将只有一个实现(。

不过,您的教授可能指的是多态性而不是动态绑定

最新更新