深入java多态

首先解释什么是多态?

比如

abstract class People{
    abstract void say();//定义一个抽象方法
}
public class A extends People{
    public void say(){
        System.out.println("I'm a");
    }
}
public class B extends People{
    public void say(){
        System.out.println("I'm b");
    }
}
public class Main(){
    public static void main(String[] args){
        People people = new A();
        people.say();//-----I'm a
        people = new B();
        people.say();//------I'm b
    }
}

多态就是父类能够实现子类实现的自己的方法。
那么多态实怎样在内存中实现的??

多态的内存实现

在内存中,两个类(继承关系)建完之后大约是这样的
类内存图
栈中存储的是指针,指向A和B的实例。实例里面有指针指向类的内存空间。
如果运行时,通过虚方法调用A的一个方法,需要通过栈里的A的指针,找到实例,再找到类,通过在类中这个方法存储的位置找到这个方法,才能调用成功,如果是实方法调用,那么直接通过类指针找到类中的方法进行调用,不需要通过实例部分。
多态发生的时候,B继承了A,首先找到A栈指针,然后判断A的类型是B,会找到B的实例。找到B的类,然后调用B的方法,也就是通过虚方法调用,多态是不能通过实方法调用的。
而super的实现,因为直接继承了父类的方法,也没有多态,因此都是实方法调用,看到super就直接通过类指针找到类,调用父类的方法。因为是实方法调用,所以编译器编译后的字节码对应部分比较精简,编译器私自添加的代码比较少,如果通过虚方法调用(java默认调用方法是通过虚方法)那么代码数量会很多。。所以能够通过super调用父类方法,就尽量使用super。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值