java中经常会有面试题考一些重载和重写的知识下面分析二者各自特性以及如何区分
(1)重载 (overload)
定义:java中允许方法名相同,但是参数列表不同,我们称之为方法的重载;
我们可以把 方法名 和 参数列表 定义为 方法签名;也就是方法签名包含方法名和参数列表两部分;一个类中是不可以有方法签名相同的两个方法,否则会报错的;
方法重载的意义:就是同一方法名根据传入的参数不同会有不同的方法功能; 具体举例就像超市的收银台可以收现金,可以刷卡,可以支付宝;可以微信,可以超市购物卡;收银台就可以比喻成一个收银方法,而付款方式久比喻成不同的参数;
(2)重写(override)
定义:子类覆盖继承自父类的方法,即方法名和参数列表都相同(即方法签名相同)但方法的实现不同称之为重写;重写一般都是在继承和实现接口的时候用到;
意义:可以修改父类方法,也可以在父类的基础上扩展功能(需要用到super关键字);有一点注意的是:在父类引用指向子类对象 时调用的还是子类的重写后的方法
(3)重写与重载区别
1)重载是在程序编译时就根据参数不同绑定不同的功能,重写则是在程序运行阶段根据对象类型不同调用(切记不是引用的类型是是对象的类型 new出来的是对象)
2)同一个类中是不会有重写的,但是可以有重载(例如构造方法的重载);而且子类也可以重载继承自父类的方法的;
3)重载是和返回值类型无关的两个方法的重载他们的返回值是没有要求可以相同也可以不同,
重写的返回值是有要求的;
有两种情况: 第一种返回值是基本类型 这时候重写方法的返回值一定是相同的; 第二种,返回值是引用类型,这时候重写方法的返回值可以与父类被重写的方法返回值类型相同(假设父类函数返回的是A类型的),也可以是A类的子类;而且子类重写方法抛出的异常也要比父类的小;
4)访问修饰:重载的访问修饰是不限定的;重写的访问修饰符 有要求: 子类的访问修饰符开放性大于或则着等于父类方法的访问修饰符,也就是说父类的 protected 修饰的函数 子类重写后要 是protected 活着public才行 不能是private;
最后留一道例题:
calss A{
protected int F(int a,int b){
return 0
}
}
下列可以在A的子类中使用的是
A public int F (int a, int b) { return 0; } //重写
B private int F(int a, int b) { return 0; } //不可以 private小于protected
C private int F(int a, long b) { return 0; } //重载
D public short F(int a, int b) { return 0; } //不可以基本类型返回值不同