一、方法的重写(overwrite/override)
1.为什么需要方法的重写
子类在继承父类以后,就获取了父类声明中的所有方法,但是父类中的所用方法可能不太适用于 子类,换句话说,子类需要对父类中的=继承过来的方法进行覆盖、覆写的操作。
举例(银行账户):
class Account{//账户
double balance;//余额
//取钱
public void withdraw(double amt){
//判断balance余额是否够amt的取钱额度
}
}
class CheckAccount extends Account{//信用卡
double protectedBy;//透支额度
public void withdraw(double amt){
//判断balance余额是否够amt的取钱额度
//如果不够,可以考虑从protectedBy中取
}
}
2.何为方法重写
子类对父类继承过来的方法进行覆盖、覆写的操作就叫方法的重写
3.方法重写应遵循的规则
方法声明的格式:权限修饰符 返回值类型 方法名(形参列表){//方法体}
具体规则: 1.父类被重写的方法与子类重写的方法的方法名和形参列表必须一致
2.子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符 >特例:子类不能重写父类中声明为private权限修饰的方法
3.关于返回值类型: >父类被重写的方法的返回值类型是void,则子类重写的方法返回值类型必须是void >如果父类被重写的方法的返回值类型是基本数据类型,则子类中重写的方法的返回值类型必须与被重写的方法的返回值类型相同 >如果父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被 重写的方法的返回值类型相同 或 是被重写方法的返回值类型的子类
4.子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类 补充说明:方法体:没有要求,但是子类重写的方法的方法体必然与父类被重写的方法不同
4.面试题:区分方法的重载(overload)与重写(overwrite/override)
重载:“两同一不同” 重写:继承以后,子类覆盖父类中同名同参的方法
[类比]相同类型的面试题: throws / throw final / finally / finalize Collection / Collections String / StringBuffer /StringBuilder ArrayList / LinkedList HashMap / LinkedHashMap / Hashtable ...
sleep() / wait() ==/ equals() 同步 / 异步
二.方法重载的测试-求圆柱的体积和表面积
Circle类
package Oop2.atguigu04_override.exer2;
public class Circle {
private double radius;//半径
public Circle() {
this.radius=1;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double findArea(){
return 3.14*radius*radius;//求圆面积
}
}
Cylinder类(圆柱)
package Oop2.atguigu04_override.exer2;
public class Cylinder extends Circle {
private double length;
public Cylinder() {
this.length = 1;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
//求圆柱的体积
public double findVolume(){
return (3.14*getRadius()*getRadius())*length;
}
//求表面积
public double findArea(){
return 3.14*getRadius()*getRadius()*2+2*3.14*getRadius()*getLength();
}
}
测试类
package Oop2.atguigu04_override.exer2;
public class CylinderTest {
public static void main(String[] args) {
Cylinder cy = new Cylinder();
cy.setRadius(2.3);
cy.setLength(1.4);
System.out.println("圆柱的体积为:"+cy.findVolume());
System.out.println("圆柱的表面积:"+cy.findArea());
}
}