方法的重写
在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。
在重写方法时,需要遵循下面的规则:
- 参数列表必须完全与被重写的方法参数列表相同。
- 返回的类型必须与被重写的方法的返回类型相同。
- 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)。
- 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。例如,父类的一个方法声明了一个检査异常 IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常。
例1:无参数
//父类
public class Person {
public void life(){
System.out.println("吃饭睡觉工作学习");
}
}
//子类
public class Student extends Person {
public void life(){//对父类Person中的life()方法进行重写。
System.out.println("内卷");
}
}
public class Man extends Person{//不对Person中的life()方法进行重写操作
}
public class Test {
public static void main(String[] args) {
Person p1=new Person();
Person s1 = new Student();
Man m1 = new Man();
p1.life();//吃饭睡觉工作学习
s1.life();//内卷
m1.life();//吃饭睡觉工作学习
}
}
Student类和Man类继承了Person类的方法和属性,其中Student类对Person的life方法进行重写,而Man类不进行任何操作。
输出调用时,Man调用Person父类中的life方法,而Student调用的是重写后的life方法。
例2:有参数
此时的Student的life重写是未加参数的,报错
//父类
public class Person {
public String life(String name){
return name+"在吃饭睡觉工作学习";
}
}
public class Student extends Person {
public String life(String id){
return id+"内卷";
}
}
//子类
public class Man extends Person{
}
主类:用于调用
package oop;
public class Test {
public static void main(String[] args) {
Person p1=new Person();
Person s1 = new Student();
Man m1=new Man();
System.out.println(p1.life("XiaoMing")+"吃饭睡觉工作学习");
System.out.println(s1.life("191110373"+"内卷"));
System.out.println(m1.life("XiaoHong")+"吃饭睡觉工作学习");
}
}
XiaoMing在吃饭睡觉工作学习吃饭睡觉工作学习
191110373内卷内卷
XiaoHong在吃饭睡觉工作学习吃饭睡觉工作学习
重写时,返回值和形参都不能改变
重写:需要有继承关系,子类重写父类!
- 方法名必须相同
- 参数列表必须相同
- 修饰符的范围扩大,但不能缩小:public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能被扩大
为什么需要重写:父类的功能,子类不一定需要,或者不一定满足
ALT+INSERT :override
版权声明:本文为weixin_45804632原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。