简介
- 在子类中根据需要对从父类中继承来的方法进行重新的改造,也称为方法的重置、覆盖(override 或 overwrite)。
- 重写以后,当创建子类的对象,并通过子类对象调用父类中的同名同形参列表的方法时,实际执行的是子类重写父类的方法。
- 子类称之为重写的方法,父类称为被重写的方法
举例:
public class Animal{
public void shout() {
System.out.println("动物:叫");
}
}
public class Dog extends Animal{
@Override
public void shout() {
System.out.println("汪!汪!汪!");
}
}
方法重写的规定:
(1)方法名,形参列表
public class Person{
public void run(int distance){
System.out.println("我早上跑了" + distance + "公里");
}
}
//子类重写的方法的方法名及形参列表必须与父类被重写的方法的方法名和形参列表相同
public class Student extends Person {
@Override
public void run(int distance){
System.oout.println("学生体育课跑了" + distance + "米");
}
}
(2)权限修饰符
public class Person{
private void show() {
System.out.println("我是一个人");
}
}
//子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符,子类中不能重写权限修饰符为private的方法
public class Student extends Person {
// 不认为是方法的重写
public void show() {
System.out.println("我是一个学生");
}
}
(3)返回值类型
public class Person{
public Object info() {
return null;
}
}
//如果父类中被重写的方法的返回值为A类,则子类中重写的方法返回值类型可以是A类或A类的子类
public class Student extends Person {
@Override
public String info() {
return null;
}
}
public class Person{
public double info1() {
return 1.0;
}
}
//如果父类中被重写的方法的返回值类型为基本数据 或 void,则子类重写的方法的返回值类型必须与被重写方法的返回值类型相同
public class Student extends Person {
@Override
public double info1() {
return 2.0;
}
}
(4)异常
//子类重写的方法抛出的异常类型大于父类被重写方法抛出的异常类型
(5)static
//子类和父类中同名同参数的方法要么都声明为static要么都声明为非static
方法重载与重写的区别:
(1)重载,是指在同一个类中,允许存在多个同名方法,而这些方法的形参列表不同; 重写,是指子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。
(2)具体的规则不同。重载不考虑方法的权限修饰符、返回值类型、形参变量名、方法体,等;重写则需考虑多方因素。
(3) 重载不表现为多态性; 重写表现为多态性。