Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口_Java - Fatal编程技术网

Java接口

Java接口,java,Java,JVM使用的虚拟表解析策略是什么意思? 有人能详细解释一下吗?基本上,任何未声明的final方法都可以在任何继承类中重写。虚拟表解析策略是Java如何动态地将方法调用分派到对象的运行时类型的方法定义。例如,如果您有一个对象s,该对象被声明为Shape类型,但被实例化为new Circle()(即Shape s=new Circle()),然后您调用s.draw()。。。如果“圆”替代了“绘制”,则您希望调用绘制方法的圆版本,而不是该方法的形状版本。这些信息只能在运行时才能计算出来(如果向您传递了

JVM使用的虚拟表解析策略是什么意思?
有人能详细解释一下吗?

基本上,任何未声明的
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"