我遇到了一个 quora 用户“Monis Yousuf”的完美答案。他完美地解释了这一点。我把它放在这里供其他人使用。
绑定主要是面向对象编程中与多态性相关的一个概念。
首先,了解什么是多态。书上说它的意思是“一个名字和多种形式”。没错,但太抽象了。让我们举一个现实生活中的例子。你去看“医生”,医生可能是眼科专家、耳鼻喉科专家、神经外科医生、顺势疗法医生等。
这里的“医生”是一个名字,可以有多种类型;每个人都执行自己的功能。这是现实生活中的多态性。
函数重载:这个概念描述了静态绑定。函数重载大致可以定义为,两个或多个同名但签名不同(包括参数个数、参数类型、返回类型不同)的方法(函数)称为重载方法(或函数)。
假设您必须计算矩形和圆形的面积。见以下代码:-
class CalculateArea {
private static final double PI = 3.14;
/*
Method to return area of a rectangle
Area of rectangle = length X width
*/
double Area(double length, double width) {
return (length * width);
}
/*
Method to return area of circle
Area of circle = π * r * r
*/
double Area(double radius) {
return PI * radius * radius;
}
}
在上面的代码中,有两个参数不同的方法“Area”。这种情况属于函数重载。
现在,进入真正的问题:这个静态绑定如何?
当您在代码中调用上述任何函数时,您必须指定要传递的参数。在这种情况下,您将通过:
- 双精度类型的两个参数[将调用第一个方法,以
计算矩形]
- double类型的单参数[调用第二种方法,计算圆的面积]
因为在编译时 java 编译器可以确定调用哪个函数,它是编译时(或静态)绑定。
函数覆盖:函数覆盖是一个在继承中显示的概念。大致可以定义为:当父类中存在一个方法,而其子类也有相同的签名方法相同时,称为函数覆盖。 [还有更多,但为了简单起见,我写了这个定义]下面的代码会更容易理解。
class ParentClass {
int show() {
System.out.println("I am from parent class");
}
}
class ChildClass extends ParentClass{
int show() {
System.out.println("I am from child class");
}
}
class SomeOtherClass {
public static void main (String[] s) {
ParentClass obj = new ChildClass();
obj.show();
}
}
在上面的代码中,show() 方法被覆盖,因为父类和子类中都存在相同的签名(和名称)。
在第三个类SomeOtherClass中,ParentClass类型的引用变量(obj)保存了ChildClass的对象。接下来,从同一个引用变量(obj)调用方法show()。
同样的问题:这个动态绑定如何?
在编译时,编译器检查 Reference 变量的类型是否为 ParentClass,并检查该类中是否存在方法 show()。一旦它检查到这一点,编译就成功了。
现在,当程序运行时,它看到对象属于ChildClass,因此它运行ChildClass 的show() 方法。由于此决定是在 RUNTIME 进行的,因此称为 Dynamic Binding(或 Run-time Polymorphism)。
Link原始答案