Programming languages 静态绑定和动态绑定之间有什么区别?
绑定时间可以分为两种类型:静态和动态。静态绑定和动态绑定之间有什么区别Programming languages 静态绑定和动态绑定之间有什么区别?,programming-languages,language-design,Programming Languages,Language Design,绑定时间可以分为两种类型:静态和动态。静态绑定和动态绑定之间有什么区别 您能给出一个简单的例子来进一步说明吗?在最一般的术语中,静态绑定意味着在编译时解析引用 动态绑定意味着在运行时解析引用 它取决于绑定发生的时间:编译时(静态)或运行时(动态)。调用简单类方法时使用静态绑定。当您开始处理类层次结构和虚拟方法时,编译器将开始使用所谓的s。那时,编译器不知道要调用什么方法,它必须等到运行时才能找到要调用的正确方法(这是通过)。这称为动态绑定 有关更多详细信息和参考信息,请参阅上的Wikipedia
您能给出一个简单的例子来进一步说明吗?在最一般的术语中,静态绑定意味着在编译时解析引用 动态绑定意味着在运行时解析引用
它取决于绑定发生的时间:编译时(静态)或运行时(动态)。调用简单类方法时使用静态绑定。当您开始处理类层次结构和虚拟方法时,编译器将开始使用所谓的s。那时,编译器不知道要调用什么方法,它必须等到运行时才能找到要调用的正确方法(这是通过)。这称为动态绑定
有关更多详细信息和参考信息,请参阅上的Wikipedia文章。编译时完成的绑定是静态绑定,运行时完成的绑定是动态绑定。在静态绑定中,指针的数据类型决定调用哪个方法。但在动态绑定中,对象的数据类型决定调用哪个方法。*执行时间:-*将变量绑定到其值,以及在执行时将变量绑定到特定存储位置称为执行时绑定 它可能有两种类型
我得到了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;
}
}
在上面的代码中,有两种不同参数的“区域”方法。此场景符合函数重载的条件
现在,进入真正的问题:静态绑定是如何实现的
在代码中调用上述任何函数时,必须指定要传递的参数。在此场景中,您将通过以下任一步骤:
- double[类型的两个参数将调用第一个方法 计算矩形的宽度]
- double类型的单个参数[将调用第二种方法,以计算圆的面积]
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(
)
同样的问题是:这种动态绑定是如何实现的
在编译时,编译器检查引用变量的类型是否为ParentClass
,并检查该类中是否存在方法show()
。一旦检查了这一点,编译就成功了
现在,当程序运行时,它看到对象是ChildClass
,因此,它运行ChildClass
的show()
方法。由于此决定是在运行时做出的,因此称之为动态绑定(或运行时多态性)
对于原始答案,静态绑定:是在编译时解析类型、成员和操作的过程。 例如:
Car car = new Car();
car.Drive();
dynamic d = new Car();
d.Drive();
在本例中,编译器通过查找car
对象上的无参数Drive
方法进行绑定。如果没有找到那个方法!搜索采用的方法,如果未找到该方法,则再次搜索该方法的Car
,如果未找到该方法,则再次搜索Car
类型。如果没有找到匹配项,您将得到编译错误
在这种情况下,绑定是由编译器完成的,绑定依赖于静态地知道对象的类型。这使得它成为静态绑定
动态绑定:动态绑定将绑定(解析类型、成员和操作的过程)从编译时推迟到运行时。
例如:
Car car = new Car();
car.Drive();
dynamic d = new Car();
d.Drive();
动态类型告诉编译器我们希望运行时类型d
具有Drive
方法,但我们不能