1.重写的概念
重写,也被称为覆盖。重写是子类对父类的非静态,非private修饰,非final修饰,非构造的方法实现过程的重新编写。子类重写的方法的参数和返回值类型与父类的方法相同。
2.方法重写的规则
- 子类重写的方法与父类的参数和返回值类型一致
- 子类中重写后的方法修饰符范围不能小于父类方法的修饰符 (eg:父类方法被public修饰,当父类实现多态,动态绑定的过程中,如果子类被protected修饰。那么在可以调用父类public的环境下,就可能会对子类调用失败。)
- 父类的静态方法和构造方法不能被重写
- 重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写
class Animal{private String name;private int age;public void eat(){System.out.println("吃东西");}public void voice(){System.out.println("一般声音");}
}class Cat extends Animal{@Override //子类Cat对父类Animal的eat方法的重写public void eat() {System.out.println("吃小鱼干");}@Override //子类Cat对父类Animal的voic方法的重写public void voice() {System.out.println("喵喵喵");}
}class Dog extends Animal{@Override //子类Dog对父类Animal的eat方法的重写public void eat() {System.out.println("啃骨头");}@Override //子类Dog对父类Animal的voic方法的重写public void voice() {System.out.println("汪汪汪");}
}
3.重写与重载的区别
- 对于参数,重写不能改变原有的参数的任何,重载可以修改方法的参数
- 对于返回值类型,重写不能修改方法的返回值类型,重载可以修改返回值类型
- 对于修饰符,重写的子类的修饰符一定不能小于父类的修饰符,重载不做要求
4.静态绑定和动态绑定
静态绑定:也称为‘早绑定’,即我们可以根据方法的参数决定具体调用哪一个方法。像是重载(因为重载的一个参考点是‘参数’,就算方法名相同,我们可以根据相同方法名中传参类型的不同来确定是具体调用哪一个方法)
动态绑定:也称为‘晚绑定’,即我们不能根据方法的参数类型来确定具体调用哪一个方法,直到参数中的引用具体调用对象后,我们才知道具体调用了哪一个方法。像是重写