重写
- 什么是方法的重写
在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。(父亲会唱歌继承给儿子,但是儿子想要比父亲唱的好就需要重写)
- 重写方法的注意点
- 参数列表必须完全与被重写的方法参数列表相同,返回的类型必须与被重写的方法的返回类型相同(Java1.5 版本之前返回值类型必须一样,之后的 Java 版本放宽了限制,返回值类型必须小于或者等于父类方法的返回值类型),总结就是子类重写的方法必须和父类一致,只是方法体不同
- 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)。
- 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常(Exception>IOException)
- 重写的方法可以使用 @Override 注解来标识。
5.方法的重写存在继承关系中,父类的成员方法只能被它的子类重写。- 声明为 final 的方法不能被重写,构造方法不能被重写,声明为 static 的方法不能被重写,但是能够再次声明
- 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法。
- 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。
//父类
public class Person {
//静态方法不能被重写
public static void talk(){
System.out.println("a");
}
public void eat() {
System.out.println("person");
}
}
//子类
public class Student extends Person {
//静态方法不能被重写
public static void talk(){
System.out.println("b");
}
@Override
public void eat() {
System.out.println("student");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Student student = new Student();
Person person1 = new Person();
//父类的引用指向子类的对象
Person person2 =new Student();
student.eat();//输出student
person1.eat();//输出person
person2.eat();//输出student
student.talk();//输出b
person1.talk();//输出a
person2.talk();//输出a
}
}