方法重写(覆写、覆盖)【研究抽象类和接口的第一步】
一、方法的重写
发生在有继承关系的类中,如果子类定义了与父类完全相同的方法(返回值 参数列表 方法名全相同),这样的操作叫重写(Override)。
class Person{
public void print(){
System.out.println("Person类的输出");
}
}
class Student extends Person{
public void print(){
System.out.println("Student类的输出");
}
}
public class Test{
public static void main(String[] args) {
new Person().print();
new Student().print();
}
}
/**输出
Person类的输出
Student类的输出
*/
方法重写的作用在于增强了类的重用性、拓展性,因为子类不仅继承了父类的东西,也能加入自己的东西,我们只要在主类中写print()函数,无需知道具体使用了哪个类,就可以得的这一个类具体的信息。
判断当前方法调用的是哪个类的方法:
a.当前使用的对象是通过哪个类new的
b.调用的方法是否被子类所重写,如果被重写,则调用的一定是子类所覆写后的方法
方法重写时的注意事项:
1.被重写的方法不能拥有比父类更为严格的访问控制权限
意味着如果父类使用public进行方法声明,那么子类必须也使用public;如果父类使用default,那么子类可以使用default或者public。
访问控制权限
private (私有)<default(啥也不写)包访问权限 < public(公有访问权限)
2.方法覆写不能出现private关键字 ,隐式继承的方法无法被重写
如果现在父类方法使用private定义,子类中使用public重写,其实并不算重写。父类方法使用了private定义,那么就表示该方法只能被父类使用,子类无法使用。换言之,子类根本就不知道父类有这样的方法。子类写了与父类完全相同的方法只能算是一个新方法,和父类没有关系。
二、属性的重写
当子类定义了和父类属性名称完全相同的属性的时候,就成为属性的重写。实际没什么意义,因为类中的属性都要求使用private封装,一旦封装了,子类不知道父类具有什么属性,那么也就不存在属性重写的问题了。