1.什么是方法重写
子类对父类中同名同参数的方法进行重写覆盖。
public class Person {
public void say(){
System.out.println("父类中的方法");
}
}
public class Student extends Person{
}
执行以下语句时,调用的是父类中定义的方法,子类继承父类就具有了父类中的方法。
Student student = new Student();
student.say(); //父类中的方法
然而我们想自己写这个方法,不想用父类的。
public class Student extends Person{
public void say(){
System.out.println("子类中的方法");
}
}
再次执行发现调用的是子类中的方法。
Student student = new Student();
student.say(); //子类中的方法
2.重写要求
(1)子类父类中,方法名和形参列表相同。
(2)子类重写方法的权限修饰符不小于父类中方法的权限修饰符,例如父类中方法使用缺省,则子类中只能使用缺省或public,否则会报错。
(3)子类不能重写父类中声明为private权限的方法,因为父类中的方法权限为private,子类看不到,自然无法copy覆盖,此时在子类中写一样的方法相当于一个新的方法,而不是重写。
(4)返回值类型
① 父类中方法是void,则子类中方法只能是void。
② 父类中方法是A类型,则子类中方法可以是A类型或A类的子类。
③ 父类中方法是基本数据类型(double),则子类中方法必须是相同的基本数据类型(double)。
(5)子类重写方法抛出的异常 ≤ 父类被重写方法抛出的异常。
(6)static修饰
① 父类中使用static,子类中不使用,报错。
② 父类中使用static,子类中使用static,不会报错,子类的方法将父类的方法进行了隐藏,而非重写,参考链接。
③ 父类中不使用static,子类中使用static,报错。
3.重载和重写的区别
-
重载:多个同名方法,参数不同,编译器根据参数不同来区分,方法的调用地址在编译期就绑定了(早绑定或静态绑定),子类可以重载父类的同名不同参数的方法,不表现为多态性。
-
重写:子类重写父类中的方法,自己实现,直到方法调用的那一刻,解释器才会确定所要调用的具体方法(晚绑定或动态绑定),变现为多态性