重写:
重写(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");
}