一、代码
public class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
zi.method();
}
}
public class Fu {
int num = 10;
public void method() {
System.out.println("父类方法");
}
}
public class Zi extends Fu {
int num = 20;
@Override
public void method() {
super.method(); // 调用了父类方法
System.out.println("子类方法");
}
public void show() {
int num = 30;
System.out.println(num); // 30
System.out.println(this.num); // 20
System.out.println(super.num); // 10
}
}
二、运行过程
[方法区中]
.class文件
Fu.class{
int num
method() //父
}
Zi.class{
[[super_class]] //指向Fu.class
}
Demo.class{
}
[在栈中]
main方法最先进栈,顺序执行main中的语句
1.语句1:Zi zi = new Zi();
首先new一个Zi类对象,对象的内容存储在堆中,栈中保存其对象地址值;
[在堆中]
new Zi():
子类构造 this
1.父类构造 super
int num=10
0x method() //父,存储方法区中父类method方法的地址
2.int num=10
3.0x method() //子,存储方法区中子类method方法的地址
4.0x show()//子类独有方法
[在栈中]
2.语句2:zi.show()
让show方法进栈,
show()
int num=30;
sout(num);//指向上一句的num
sout(this.num);//指向堆中的子类内容(this)
sout(super.num);//指向(super)
运行结束,释放栈内show()的空间
3.语句3:zi.method();
- 让method方法进栈,Zi类覆盖重写了Fu类method方法,优先使用zi类的method方法,因此进栈的是zi类的method方法;
- 由于子类method方法是调用了父类方法,因此子类method()的首句应为父类的method方法;
method() [子]
super.method();//子类调用父类的method方法,让父类method方法进栈
sout(“子类方法”)
method() [父]
sout(“父类方法”)
4.依次释放栈内空间:
method() // 父
method() //子
main()