方法的重写
在Java中,方法重写(Overriding)是指子类重新定义父类中已经存在的方法。当子类对象调用该方法时,会执行子类中定义的行为,而不是父类中的原始行为。这是面向对象编程中的一个核心概念。
应用场景:
当父类的方法无法满足子类需求时,子类中可以重写该方法来满足子类需求
需要注意的是,在重写时,方法的签名(方法返回值类型,方法名,形参列表)都必须和父类保持一致。
模拟案例
//父类
public class Animal{
private String name;
private String type;
public Animal(String name,String type){ //父类有参构造器
this.name = name;
this.type = type;
}
public void run(){
System.out.println("动物跑的很快~");
}
}
//子类
public class Dog extends Animal{
//子类有参构造器
public Dog(String name,String type){
super(name,type); //向上传递
}
//重写run方法
@Override //表示重写的注解
public void run(){
System.out.println("小狗跑的贼快~");
}
}
//Test测试类
Dog dog = new Dog("小狗","犬科"); //创建子类对象
dog.run(); //小狗跑的贼快~
上面的案例中,我们可以看到,dog调用的是子类Dog中重写的run方法.
方法重写的规则
- 签名相同:重写的方法必须具有与父类中被重写方法相同的名称、参数列表和返回类型(或者是子类型)。
- 访问权限:重写方法的访问权限不能比父类中被重写的方法更严格。例如,如果父类方法声明为public,那么子类中重写的方法也必须是public。如果父类方法声明为默认,子类重写的方法可以是public和默认。
- 静态方法:静态方法不能被重写,因为它们属于类,而不是类的实例。但是,可以在子类中创建与父类静态方法具有相同名称和参数列表的另一个静态方法,这通常被称为“隐藏”。
- 构造方法:构造方法不能被重写,但可以通过调用super()在子类构造方法中调用父类的构造方法。
@Override注解
虽然不是强制的,但推荐在重写方法上使用@Override
注解。这样做可以增加代码的可读性,并且如果父类的方法发生变化,编译器会帮助检查是否仍然满足重写的规则。如果方法签名不匹配,编译器会报错。