首先解释什么是多态?
比如
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。