基本定义
在子类中可以根据需要从父类中继承的方法进行改造,也成为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
几点要求
1、子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
2、子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
3、子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
4、子类方法抛出的异常不能大于父类被重写方法的异常
PS:
子类与父类中同名参数的方法必须同时声明为非static的(即为重写),或者同时声明为static(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
应用
1、子类继承父类后,可以对父类同名同参数的方法进行覆盖操作。
2、重写以后,当创建子类对象以后,通过子类调用父类中的同名同参数的方法时,实际执行的是子类中重新的父类方法。
如果调父类的该方法,执行的还是父类的方法。
具体规定
方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
//方法体
}
子类中的叫重写的方法,父类中叫被重写的方法。
1、子类重写的方法的方法名和形参列表与父类被重写的方法名和形参列表相同。
2、子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
3、子类不能重写父类中权限修饰符为private的方法
4、返回值类型:
1)父类被重写的方法的返回值类型是void,则子类重写的方法的返回字号类型只能是void
2)父类被重写的方法的返回值类型是A类型,则子类重写的返回值类型可以是A类或A类的子类。
如父类定义一个Object的类,父类可以重写为String
3)父类被重写的方法的返回值类型是基本数据类型(如double),则子类重写的方法的返回值类型,必须是相同的基本数据类型(double)。
4)子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
举例:
父类:
public class Person {
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println("eat");
}
public void walk(int distance) {
System.out.println("walk " + distance + " km");
}
}
子类:
public class Student extends Person{
String major;
public Student() {
}
public Student(String major) {
this.major = major;
}
//重写
public void eat() {
System.out.println("students should eat more fruit and vegetables");
}
public void study() {
System.out.println("study and majoir is : " + major);
}
}
测试类:
public class PersonTest {
public static void main(String[] args) {
Student s = new Student("IT");
s.eat(); //students should eat more fruit and vegetables
s.walk(2);
s.study();
Person p = new Person();
p.eat();//eat
}
}