Java覆写

子类定义的方法和属性和父类同名,这种情况就叫做覆写,其中有两种情况:

  • 方法覆写
  • 属性覆盖

1.方法覆写

当子类定义了与父类方法名称,返回类型和参数一致的方法是,我们就称为方法覆写了

  • 发生覆写时,会执行该子类覆写的方法,如果没有覆写,那么就执行父类的方法

覆写使用原则:

当发现父类方法的功能不足,或者无法满足要求时,就需要采用覆写来满足功能要求

覆写要求:

  • 覆写的方法不能拥有比父类更严格的访问控制权限。 访问控制权限 public> protected>default>private,即当父类的方法声明为public时,子类覆写的方法只能时public,当父类的方法声明为default时,子类方法只能时default或者public.

疑问:如果父类的方法为private,子类定义为public 这算覆写吗?

这个时候不叫覆写,由于private 方法在子类是不可见的,就算子类中定义一个完全符合覆写要求的方法,那么也不能覆写,顶多就是子类定义了要给新方法。

  1. class A{
  2. private String name;
  3. public void fun(){
  4. print();
  5. }
  6. private void print(){
  7. System.out.println("我是A类");
  8. }
  9. }
  10. class B extends A{
  11. public void print(){
  12. System.out.println("我是B类");
  13. }
  14. }
  15. public class TestExtend{
  16. public static void main(String[] arg){
  17. B b = new B();
  18. b.fun();//结果: 我是A类
  19. }
  20. }

需要在覆写中调用父类被覆写的方法 使用 super.方法名称()


小拓展 super.方法名称()和 this.方法名称()的区别

  • 使用 this.方法名称() 会先查找本类中存不存在该方法名称的方法,如果存在直接调用,如果不存在,值查找父类中存不存在,存在则调用,如果父类中都不存在,那么会发生编译时错误。
  • 使用 super.方法名称() 不查找本类中该方法名称的方法,直接调用父类中该方法名称方法

2.属性覆盖

如果子类定义了和父类完全相同名称的属性,就属于属性覆盖