1.什么是方法的重写(override 或 overwrite)
子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
2.应用:
重写以后,当创建子类对象以后,通过类的对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
3.举例:
【代码】
class Circle{
public double findArea(){} //求圆的面积
}
class Cylinder extends Circle{ // Cylinder圆柱体
public double findArea(){} //求表面积
}
System.out.println("***********************");
class Account{ //Account银行卡
public boolean withdraw(double amt){}
}
class CheckAccount extends Account{ //CheckAccount 信用卡
public boolean withdraw(double amt){}
}
4.方法重写的规则:
方法的声明:权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{
方法体
}
约定俗称:子类中叫重写的方法,父类中叫被重写的方法
4.1 子类重写的方法的方法名和形参列表 与 父类被重写的方法的方法名和形参列表相同。
4.2 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
特殊情况:子类不能重写父类声明为private权限的方法
4.3 返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法返回值类型可以为A类或A的子类
父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型返回值。(必须也是double)
子类重写的方法抛出的异常类型不大于父类被重写方法抛出的异常类型。(具体放到异常处理时候介绍)
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
5.面试题:
区分方法的重写和重载?
- 二者的概念
- 重载和重写的具体规则
- 重载:不表现为多态性
重写:表现为多态性
重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数列表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。她们的调用地址在编译期就绑定了。Java的重载是可以包括父类和子类的。即子类可以重载父类的同名不同参数的方法。
所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为:"早绑定"或"静态绑定";
而对于多态,只有等到方法调用的那一刻,解释运行期才会确定所要调用的具体方法,这称为"晚绑定"或"动态绑定".
引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”