重写和重载的函数调用

复习过程中复习到了重写重载函数的调用,当初在听课的时候没听太明白也没细究,这次复习看明白了。

概念

重载和重写的概念很简单,就用图简单的说一下

重载:

要点就是,函数名相同,参数列表不同

重载发生在同一个类中(忽略箭头)
在这里插入图片描述
重载发生在父类和子类之间

重写

发生在父类与子类之间,函数名,返回类型以及参数列表必须相同,实现部分可以不同,但尽量不能改变父类的本意
在这里插入图片描述
父类
在这里插入图片描述
子类

调用

那么调用的时候具体调用哪一个呢?
首先确定重写和重载的检查类型,重写函数的调用是动态的,只有在程序运行的时候,才确定运行的是哪一个。而重载是静态的,它直接根据参数列表,在编译的时候就能确定调用的是哪一个函数。

然后明确程序在调用函数时的步骤
1.首先看方法能不能调用:这一步在静态检查时就能确定。看变量的声明类型,声明类里如果有调用的函数,那么就可以调用,如果没有程序直接报错。
2.确定调用哪一个:这一步在动态运行是才能确定。看变量指向的对象是什么类型,就调用哪个类型的对应函数。

举个例子:
下图红色下划线的语句,按步骤走的话
看声明 UseAnimals ua = new UseAnimals();
1.ua的类型是UseAnimals,于是就到UseAnimals类中找有没有调用的叫dostuff(Animal …)的方法,发现有,进入第二步
2.ua指向的是UseAnimals类,那么就调用该类里的对应方法
在这里插入图片描述
再来一个复杂点的例子
在这里插入图片描述
第一个:声明是Animal类型,Animal里有eat()方法,所以可以调用,指向Animal对象,调用的是父类Animal类里的eat函数
第二个:声明是Horse类型,Horse里有从父类继承来的eat()方法,所以可以调用,指向Horse对象,调用的是Horse里从父类继承来的eat()方法
第三个:声明是Animal类型,Animal里有eat()方法,所以可以调用,指向Horse对象,调用的是Horse里从父类继承来的eat()方法
第四个:声明是Horse类型,Horse里有重载的eat(String …)方法,所以可以调用,指向Horse对象,调用的是Horse里重载的eat(String …)方法
第五个:声明是Animal类型,Animal里没有eat(String …)方法,所以不可以调用,直接报错
第六个:声明是Animal类型,Animal里没有eat(String …)方法,所以不可以调用,直接报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值