java方法调用
一直想不明白java方法之间的调用关系,看了java虚拟机相关资料后有一点自己的见解,写下来加深下理解。
public class Main {
public static void main(String[] args) {
Parent parent=new PPSon();
parent.myname();
}
}
一级
public class Parent {
public void myname() {
System.out.println("myname_Parent");
// TODO Auto-generated method stub
printMyName();
}
public void printMyName(){
System.out.println("Parent");
}
}
二级
public class ParentSon extends Parent {
@Override
public void myname() {
System.out.println("myname_ParentSon");
super.myname();
}
@Override
public void printMyName() {
System.out.println("ParentSon");
super.printMyName();
}
}
三级
public class PPSon extends ParentSon{
@Override
public void myname() {
System.out.println("myname_PPSon");
// TODO Auto-generated method stub
super.myname();
}
@Override
public void printMyName() {
System.out.println("PPSon");
// TODO Auto-generated method stub
// super.printMyName();
}
}
java以栈帧的方式存储方法信息,默认为this指针。
方法执行过程中遇到super关键字会向超类进行查找;
详细内容查看《深入理解java虚拟机》19章方法的调用与返回。
大致过程是this->myname()-----ParentSon->myname()-----Parent->myname()。
这时Parent的myname中有一个printMyName(),它之前没有super修饰默认为this,
所以这时PPSon->printMyName()---ParentSon->printMyName()---Parent->printMyName()。
这时方法帧处于Partent.myname()中,方法结束的先后顺序为Parent.myname(),ParentSon.myname(),PPSon.myname()。