java中复写,以及向上转型的(转载)
Java中的多态是如何实现的?父类引用指向子类实例时,父类引用调用方法时,jvm是如何动态地调用子类中的对应的方法?如下有两个类B和A,其中B继承A,B覆盖了A类中的test方法。
public Class A{
public test(){
}
}
public Class B extends A{
public test(){
}
}
A a=new B();
a.test();
其中jvm是如何动态地调用B类中的test 方法?
public test(){
}
}
public Class B extends A{
public test(){
}
}
A a=new B();
a.test();
其中jvm是如何动态地调用B类中的test 方法?
- a声明为类型A是方便编译器能够编译时检查a是否可以调用test()方法,在实际运行时JVM记录a的实际类型是B;
- 在JVM中,B有一张方法表(分为多行),每一行的内容是方法名和指向方法实现的指针;如果是继承自A、而没有自己实现的方法,则可以将指针直接指到A的相关的方法实现;
- 在运行时,找到B的的方法表,顺着test()方法的指针找到方法实现,对a执行就可以了。
- 至于JVM能够记录a的实际类型是B,则太简单了,单凭因为a = new B()就能知道B才是a的实际类型。JVM可以记录一个指针,使得a指向类B。
- 仅参考《深入JVM虚拟机》一书的相关章节就能找到答案;当然参考<The JVM Specifications>也是可以的。
- 总结:很多行为就是为了忽悠编译器的,为了编译通过。
1.这里只记录一些学习笔记
2.这里只记录一些学习心得,如果心得方向有错,请留言
2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)