Java接口
JVM使用的虚拟表解析策略是什么意思?Java接口,java,Java,JVM使用的虚拟表解析策略是什么意思? 有人能详细解释一下吗?基本上,任何未声明的final方法都可以在任何继承类中重写。虚拟表解析策略是Java如何动态地将方法调用分派到对象的运行时类型的方法定义。例如,如果您有一个对象s,该对象被声明为Shape类型,但被实例化为new Circle()(即Shape s=new Circle()),然后您调用s.draw()。。。如果“圆”替代了“绘制”,则您希望调用绘制方法的圆版本,而不是该方法的形状版本。这些信息只能在运行时才能计算出来(如果向您传递了
有人能详细解释一下吗?基本上,任何未声明的
final
方法都可以在任何继承类中重写。虚拟表解析策略是Java如何动态地将方法调用分派到对象的运行时类型的方法定义。例如,如果您有一个对象s
,该对象被声明为Shape
类型,但被实例化为new Circle()
(即Shape s=new Circle()
),然后您调用s.draw()
。。。如果“圆”替代了“绘制”,则您希望调用绘制方法的圆版本,而不是该方法的形状版本。这些信息只能在运行时才能计算出来(如果向您传递了一个Shape对象,那么它可能是从编译器从未看到的JAR传入的,因此编译器无法计算Shape的哪个特定子类是实例化的),因此由VM将方法调用分派到正确的方法定义(在本例中,由Circle提供的绘图版本)
//Shape.java
公共阶级形态
{
公众抽签(){
System.out.println(“我是一个形状”);
}
}
//java
公共阶级圈子扩大化
{
公共无效绘图(){
System.out.println(“我是一个圆”);
}
}
//别处
形状s=新圆();
s、 draw();//应该打印“我是一个圆”
对于虚拟表的大多数实现,每个类都有一个表,其中每个条目都是一个成员函数及其相应的地址。因此,圆形和形状的虚拟表在表中都有一个条目用于“绘制”,但圆形和形状的虚拟表都有draw point的条目,指向其各自的函数定义。然后,该类的每个实例都指向其给定类的虚拟表。因此,当您执行
new Circle()时
,它包含一个指向圆的虚拟表的条目。当调用未声明为final
的方法时,通过在对象的虚拟表中查找适当的偏移量来调用适当的方法实现。基本上,任何未声明为final
的方法都可以在任何in编写类。虚拟表解析策略是Java如何动态地将方法调用分派到对象运行时类型的方法定义。例如,如果您有一个对象s
,该对象被声明为Shape
类型,但被实例化为new Circle()
(即Shape s=new Circle()
)然后调用s.draw()
…如果圆覆盖draw
,则希望调用圆版本的draw方法,而不是形状版本的该方法。此信息只能在运行时计算出来(如果向您传递了一个Shape对象,那么它可能是从编译器从未见过的JAR传入的,因此编译器无法确定Shape的特定子类是实例化的),因此由VM将方法调用分派给正确的方法定义(在本例中,是Circle提供的draw版本)
//Shape.java
公共阶级形态
{
公众抽签(){
System.out.println(“我是一个形状”);
}
}
//java
公共阶级圈子扩大化
{
公共无效绘图(){
System.out.println(“我是一个圆”);
}
}
//别处
形状s=新圆();
s、 draw();//应该打印“我是一个圆”
对于虚拟表的大多数实现,每个类都有一个表,其中每个条目都是一个成员函数及其相应的地址。因此,圆形和形状的虚拟表在表中都有一个条目用于“绘制”,但圆形和形状的虚拟表都有draw point的条目,指向其各自的函数定义。然后,该类的每个实例都指向其给定类的虚拟表。因此,当您执行new Circle()时
,它包含一个指向圆的虚拟表的条目。当调用未声明为final
的方法时,通过在对象的虚拟表中查找适当的偏移量来调用适当的方法实现
// Shape.java
public class Shape
{
public void draw(){
System.out.println("I'm a Shape");
}
}
// Circle.java
public class Circle extends Shape
{
public void draw(){
System.out.println("I'm a Circle");
}
}
// Elsewhere
Shape s = new Circle();
s.draw(); // should print "I'm a Circle"