java接口调用是什么?方法表是什么?

BSO 2020-11-18 16:23:19 java常见问答 3257

有时候在学习java的过程中,总是会遇到各种各样的问题,因为它本身的功能都是非常强大的,所以学习的时候会难理解。今天为大家介绍一下,java接口调用的有关内容。一起来了解一下吧。

其实,Java类是可以同时实现多个接口的,而当用接口引用调用某个方法的时候,情况就有所不同了。Java允许一个类实现多个接口,从某种意义上来说相当于多继承,这样同样的方法在基类和派生类的方法表的位置就可能不一样了。代码如下所示:

interface IDance
{
    void dance();
}
class Person
{
    public String toString()
    {
        return "I'm a person.";
    }
    public void eat()
    {}
    public void speak()
    {}
}
class Dancer extends Person implements IDance
{
    public String toString()
    {
        return "I'm a dancer.";
    }
    public void dance()
    {}
}
class Snake implements IDance
{
    public String toString()
    {
        return "A snake.";
    }
    public void dance()
    {
        //snake dance  
    }
}

从上面的代码可以看出来,由于接口的介入,继承自于接口IDance的方法dance()在类Dancer和Snake的方法表中的位置已经不一样了,显然我们无法仅根据偏移量来进行方法的调用。

同时,Java对于接口方法的调用是采用搜索方法表的方式,如,要在Dancer的方法表中找到dance()方法,必须搜索Dancer的整个方法表。因为每次接口调用都要搜索方法表,所以从效率上来说,接口方法的调用总是慢于类方法的调用的。

那么,方法表是什么呢?

方法表是实现动态调用的核心。上面讲过方法表存放在方法区中的类型信息中。为了优化对象调用方法的速度,方法区的类型信息会增加一个指针,该指针指向一个记录该类方法的方法表,方法表中的每一个项都是对应方法的指针。

这些方法中包括从父类继承的所有方法以及自身重写(override)的方法。

为大家补充一些相关的知识。

1.方法区:方法区和JAVA堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.运行时常量池:它是方法区的一部分,Class文件中除了有类的版本、方法、字段等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分信息在类加载时进入方法区的运行时常量池中。 方法区的内存回收目标是针对常量池的回收及对类型的卸载。

以上就是关于java接口调用是什么以及方法表是什么的主要内容了。里面所包括的知识还是比较复杂的,需要花费一定的时间去理解。java基础知识还是很多的,想要了解更多java知识,敬请关注奇Q工具网。

推荐阅读:

java中多态怎么实现接口?实例展示

java枚举中实现接口和使用接口,实例展示

java spring中构造方法怎么注入?接口注入怎么做?