Java-interface-jvm 层面的实现探析

Java 多态 JVM 层面实现 只是解析了类,本篇探析 interface 层面的实现。

测试代码

interface Eat

package com.example.demo.invokeinterface;
public interface Eat {
    void eat();
}

interface Fly

package com.example.demo.invokeinterface;
public interface Fly {
    void fly();
}

implementation Airplane

package com.example.demo.invokeinterface;
public class Airplane implements Fly {
    @Override
    public void fly() {
        System.out.println("The airplane is flying!");
    }
}

implementation Bat

package com.example.demo.invokeinterface;
public class Bat implements Eat, Fly {
    @Override
    public void eat() {
        System.out.println("The bat is eating a frog! ");
    }
    @Override
    public void fly() {
        System.out.println("The bat is flying!");
    }
}

Driver class

package com.example.demo.invokeinterface;
import java.util.concurrent.CountDownLatch;
public class InvokeInterfaceTest {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(10);
        Airplane airplane = new Airplane();
        Bat bat = new Bat();
        airplane.fly();
        bat.fly();
        bat.eat();
        countDownLatch.await();
    }
}

各个类的 vtable 和 itable

在这里插入图片描述
如上图分析的有 5 个 class。Object、Eat、Fly、Airplane、Bat。注意这 5 个类的 vtable ,每一个条目指向的方法地址都一样。AirplaneBat 这两个实现类的 itable 不一样。airplanebat调用的 fly方法并不同。这就是方法的动态指派。Airplaneitable 中包括了 Fly 这个 interface class 和实现的 fly方法。Batitable 包括了 FlyEat 这两个 interface class 和实现的 fly方法和 eat 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值