应用场景:当父类中的方法实现(功能)不能满足子类需求时,可以在子类中对父类中的方法进行重写(覆盖) 。
哮天犬是神犬,与其他动物吃东西的方式不同,那么我们就将Animal类中的eat方法,方法结构原封不动的在子类中进行定义,称为在子类中重写/覆盖父类中的方法。
@Override 注解标签,表示此方法是从父类中重写而来的,在编译期间就会进行语法上的校验,如果子类和父类的方法不一就会报错。
重写的要求:子类的方法结构与父类保持一致:
- 返回值类型一致
- 方法名一致
- 参数列表一致
- 子类访问权限大于等于父类权限
注意:构造方法和静态方法不能重写,成员变量不存在重写。
package demo1;
public class Animal extends Object{
private String name;
private int age;
void eat(){
System.out.println("动物吃东西");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package demo1;
public class Dog extends Animal{
private String type;//品种
public void play(){
System.out.println("狗会玩耍");
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
package demo1;
public class XiaoTianQuan extends Dog{
private String color;//颜色
@Override
public void eat(){
super.play();//调用父类中方法
System.out.println("哮天犬坐着吃东西");//自己的实现
this.fly();//调用自己类中方法
}
public void fly(){
System.out.println("哮天犬会飞");
}
}
package demo1;
public class Test{
public static void main(String[] args) {
XiaoTianQuan xtq = new XiaoTianQuan();
xtq.setName("哮天");
xtq.setAge(500);
xtq.eat();//调用的是哮天犬中eat(),哮天犬里的eat()把Animal中的eat()覆盖了
}
}