有时候在学习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工具网。
推荐阅读: