重写(override):也称为覆盖。在子类中把父类本身就有的方法再写一遍。【一定发生在继承上】
**重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程
进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!**重写的好处在于子类可以根据需要,定义特定
于自己的行为。 也就是说子类能够根据需要实现父类的方法。
【方法重写的规则】
- 方法名称相同
- 返回值相同【被重写的方法返回值类型可以不同,但是必须是具有父子关系的】
- 参数列表相同(数据类型,个数,顺序都相同)【例如:如果父类方法被public修饰,则子类中重写该方
法就不能声明为 protected】 - 子类的访问权限要大于等于父类的权限
- private修饰的方法不可以重写
- final修饰的方法叫做密封方法,不能被重写
- 如果被static修饰,不可重写
- 构造方法不能被重写【构造方法只能重载】
- 重写的方法, 可以使用 @Override 注解来显式指定, 有了这个注解能帮我们进行一些合法性校验。 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写
package test; //重写eat方法 class Animal { public String name; public int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void eat() { System.out.println(name + " Animal::吃"); } } class Dog extends Animal { public boolean silly; public String name = "hello"; public Dog(String name,int age,boolean silly) { super(name,age); this.silly = silly; this.name = name; } public void eat() { System.out.println(name + " Dog::吃"); } } public class Test2 { public static void main(String[] args) { Dog dog = new Dog("aa", 12, false); dog.eat(); } }重载
- 方法名称相同
- 返回值不做要求
- 参数列表不同(数据类型,个数,顺序)
void func(int x,int y) { System.out.println("func1"); } void func(int x,int y,int z) { System.out.println("func2"); }重写和重载的区别