重写和重载的函数调用
复习过程中复习到了重写重载函数的调用,当初在听课的时候没听太明白也没细究,这次复习看明白了。
概念
重载和重写的概念很简单,就用图简单的说一下
重载:
要点就是,函数名相同,参数列表不同
重载发生在同一个类中(忽略箭头)
重载发生在父类和子类之间
重写
发生在父类与子类之间,函数名,返回类型以及参数列表必须相同,实现部分可以不同,但尽量不能改变父类的本意
父类
子类
调用
那么调用的时候具体调用哪一个呢?
首先确定重写和重载的检查类型,重写函数的调用是动态的,只有在程序运行的时候,才确定运行的是哪一个。而重载是静态的,它直接根据参数列表,在编译的时候就能确定调用的是哪一个函数。
然后明确程序在调用函数时的步骤
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 …)方法,所以不可以调用,直接报错