重载(overload)和重写(方法覆盖,override,发生在子类中)
重载是值在【一个类中】定义定义多个方法名相同但参数列表不同的方法,在编译时,根据参数的个数和类型来决定绑定那个方法
重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法;
因为:变量obj的类型为super,因此:Goo的g(Super)方法被调用
重写是指在子类中定义和父类完全相同的方法,在程序运行时,根据对象的类型不同(而不是引用类型)而调用不同的版本
重写遵循所谓“运行期绑定”,即在运行的时候根据引用变量指向的实际对象类型调用方法;因为:obj实际指向的是子类的的对象,因此:子类重写后的f方法被调用
注意点:
1.【方法重写返回值类型如果是基本类型应与父类的一致】:
子类重写父类的方法如果返回值类型是基本类型的话,要求相同
2.重载,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
3.方法重写、重载的问题。 重写要求方法签名完全相同,【返回值类型如果是基本类型或无返回值时必须一致】。【重载要求方法名相同且参数列表必须不同,与返回值类型无关】。
4.子类重写父类的方法,【访问权限不能降低】;
5.子类中继承了父类的属性和方法,所以子类中可以直接进行重载父类中的方法
(单选题)在下面程序的第 7 行补充上下列哪个方法,会导致在编译过程中发生
错误( )
1) class Super{
2) public float getNum(){
3) return 3.0f;
4) }
5) }
6) public class Sub extends Super{
7) // TODO ...
8) }
A.public float getNum(){retun 4.0f;}
B.public void getNum(){}
C.public void getNum(double d){}
D.public double getNum(float d){retun 4.0f;}
【正确答案】B
【答案解析】方法重写、重载的问题。 重写要求方法签名完全相同,返回值类型如果是基本类型或无返回值时必须一致。重载要求方法名相同且参数列表必须不同,与返回值类型无关。
(多选题)下面选项中哪两个可以在 A 的子类中使用( )
class A {
protected int method1 (int a, int b) {
return 0;
}
}
A.public int method1(int a, int b) { return 0; }
B.private int method1(int a, int b) { return 0; }
C.private int method1(int a, long b) { return 0; }
D.public short method1(int a, int b) { return 0; }
【正确答案】A,C
【答案解析】B子类重写父类的方法,访问权限不能降低;C属于重载;D子类重写父类的方法如果返回值类型是基本类型的话,要求相同。
方法重写后向上造型后的父类引用,父类引用的调用子类重写后的方法时实际运行的是子类重写后的方法。
//编译时按分类类型编译
//运行时按子类对象运行