动态绑定和静态绑定是本文是java类中非常重要的机制主要讲关于动态绑定和静态绑定的相关知识点。
首先,找出调用对象方法的执行过程非常重要。以下是对调用过程的详细描述:
1)编译器查看对象的声明类型和方法名称。假设调用x.f( param),X被声明是C类的对象。需要注意的是,可能有多个名称,但参数类型不同。例如,可能有一种方法(n)和方法(String)。所有的编译器都将一一列出C类中的所有方法及其超类中的访问属性都是 public且名1为的方法。至此,编译器已经获得了所有可能被调用的候选方法。
2)编译器查看调用方法中提供的参数类型。如果所有名称方法中有一个参数类型与提供的参数完全匹配,然后调用这种方法。这个过程叫做。重载解析( overloadingresolution)。例如,调用x.f(“Hello”)来说,将选择编译器f3)如果方法是private、static、final或者构造器,那么编译器可以准确知道应该调用哪种方法?我们称这种调用方法为静态绑定。static binding)。相应地,调用哪种方法将取决于隐藏参数的实际类型,并在运行过程中动态绑定。在上面列出的例子中,编译器通过动态绑定生成一个调用f( String)的指令。
4)当程序运行并采用动态绑定调用方法时,虚拟机必须调用最适合x引用对象实际类型的方法。假设x的实际类型是D,它是C的子类。如果D类定义了该方法(String),直接调用它;否则,我们将在D类超类中寻找方法( String),以此类推。
每次调用方法都要搜索,时间成本相当大。因此,虚拟机提前为每个类别创建了它。建了一个方法表( method table),它列出了所有方法的签名和实际调用方法。这样,当真正调用该方法时,虚拟机只能找到该表。在前面的例子中,虚拟机是素D类方法表,以便找到和调用f(String)匹配的方法。这种方法可能是D.f( String),也可能是X.( String),这里的X是D的超级类别。这里需要提醒的是,如果使用super.f (param),编译器将搜索隐式参数超类的方法表。
现在让我们分析一下调用e.getSalary()详细的过程。e声明为Employee类型。 Employee类只有一个名字getSalary的方法,这种方法没有参数。所以,在这里我们不用担心重载问题的分析。
由于getSalary不是private、static和f因此,inal方法将采用动态绑定和虚拟绑定拟机为Employee和Manager两个类生成方法表。在本类定义的所有方法都列在Employee的方法表中:
Employee:
getName()->Employee.getName()
getSalary()->Employee.getSalary()
getHireDay()->Employee. getHireDay()
raiseSalary(double)->Employee.raiseSalary(double)
实际上,上面列出的方法不完整,稍后会看到 Employee类有一个超级Object, Employee类从这个超级类别中继承了许多方法。在这里,我们省略了这些方法。
Manager方法表有点不同。有三种方法是继承的,一个方法律是重新定义的,还新增加的方法有一种。
Manager:
getName()->Employee, getName()
getSalary()- Manager. getSalary()
getHireDay()-> Employee.如果超类的方法是 public,那么子类方法一定要声明 public。这种错误经常发生在声明子中类方法的时候,遗漏了publIC修改符。此时,编译器将其解释为试图削弱访问权限。
动态绑定和静态绑定是动态绑定如果你还没有完全掌握java基础知识中必须掌握的核心技术,不用担心,这个网站java视频课程有更详细的解释等着你去看。