Java继承和覆盖--示例

本示例分析了Debug过程,理解父类和派生类中的方法,什么时候分别被调用,构造方法按照什么顺序调用。

程序如下所示:

package cn.cqu;

public class TestClu{
	public static void main(String[] args){
		go(new MyBase());
	}
	static void go(Base base){
		base.add(8);
	}
}
class Base {

	int i;
	Base() {
		add(1);
		System.out.println(i + "---base");
	}
	public void add(int v){
		i+=v;
		System.out.println(i);
	}
	void print(){
		System.out.println(i);
	}
}

class MyBase extends Base{
	 MyBase() {
	   add(2);
	   System.out.println(i + "---mybase");
	}
	 public void add(int v){
		 i+=v*2;
		 System.out.println(i);
	 }
}

进入Debug模式运行,执行的步骤为:

  run --> 第5行 --> 28 --> 14 --> 15 --> 33 --> 34 --> 35 --> 16 --> 17 --> 29 --> 33 --> 34 --> 35 

        --> 30 --> 31 --> 5 --> 8 --> 33 --> 34 --> 35 --> 9 --> 6 --> end


程序运行结果为:

----------------------------------------------------------

2
2---base
6
6---mybase
22

----------------------------------------------------------

    程序执行流程为:在主函数中首先执行(第5行) go(new MyBase()), 会首先调用父类的构造函数(第14行),在父类的函数Base中执行add()方法,注意:这里的add()方法由于是MyBase对象调用的,将会首先查找MyBase中是否有该方法,所以Base()构造方法中的add()实际上是调用的MyBase类中的add()方法(32行)。

    执行完add()之后,i的值为2,父类构造方法执行完毕;接下类执行派生类的构造方法,即MyBase(),这里的add(2)当然也是派生类的,i的值就变成了6,最后执行go方法里面的add(8),调用的是派生类中的add()方法,最终i的值为22.






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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值