我们先要明白面向对象中什么事父类什么是子类还有什么是向上造型,不明白的同学可以看我写的另外两篇篇博客:
-
Java面向对象继承 https://blog.csdn.net/gydennis/article/details/122448251
-
向上造型 https://blog.csdn.net/gydennis/article/details/122471501
重写(override/overriding):重新写、覆盖
定义
- 发生在父子类中,方法名相同,参数列表相同,子类重写父类
- 重写方法被调用时,看对象的类型
如果想在原来超类的方法基础之上修改,先调super.方法名
简单的例子
public class OverWriteDemo {
public static void main(String[] args) {
Father person = new Father();//新建一个Father对象是Father类型
person.play();//输出的答案是:1
//这里的play方法是调用Father类中的play方法,所以输出是1
Father person1 = new Son();//向上调整,这里是新建了一个Son对象是Father类型
person1.play();//输出的答案是:2
//因为从重写的定义中我们可以了解:重写方法被调用时,看对象的类型
//这里的对象时Son,所以输出是Son类型中的方法play()
Son person2 = new Son();//新建一个Son对象是Son类型
person2.play();//输出的答案是:2
//这里的play方法是调用Son类中的play方法,所以输出是2
}
}
class Father{//父类
void play(){
System.out.println("1");
}
}
class Son extends Father{//子类
//重写
void play(){
System.out.println("2");
}
}
复杂的重写例子:
在上面的代码中,我们是重写了整个方法,但是如果我们想保留父类里面的方法再添加一些新的内容怎么办,这个时候我们只需要在重写方法的第一行加一个super.方法名();
public class OverWriteDemo {
public static void main(String[] args) {
Father person1 = new Son();
person1.play();//输出是1 2
Son person2 = new Son();
person2.play();//输出是1 2
}
}
class Father{//父类
void play(){
System.out.println("1");
}
}
class Son extends Father{//子类
//重写
void play(){
super.play();
System.out.println("2");
}
}
跟上面同样的例子,但是我们在Son类的方法play第一行,放了父类Father的方法,从而最后输出是father的play输出+Son的play输出。因为重写的输出是看对象,它们都是Son类,答案所以都是1和2
注意
总结
- 发生在父子类中,方法名相同,参数列表相同
- 重写方法被调用时,看对象的类型
还要遵循两小一大:
两小:
- 派生类方法的返回值必须小于或等于超类方法的
- 派生类方法抛出的异常必须小于或等于与超类方法的
一大:
- 派生类方法的访问权限必须大于或等于超类方法