java基础知识 | 方法继承、覆盖

251 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

方法继承、覆盖和加载

方法继承

一般情况下子类可以继承父类定义的一些方法。如果子类中存在名字和父类相同的方法,在子类中调用这些方法之前要加上super。另外,若子类中不存在名字与之相同的方法,则在子类中直接调用父类的方法即可--就是不需要使用super。

  • 代码示例:
//在父类定义了三个方法
public class FatherClass{

  public void fun1(){
      System.out.println("我是父类方法1");
  }
}
  public void fun2(){
      System.out.println("我是父类方法2");
  }
}
  public void fun3(){
      System.out.println("我是父类方法3");
  }
}

定义子类SonClass并继承FatherClass

//继承了func1()、func2(),重新定义了func3()、func4()、func5().
public class SonClass extends Fathers{
    public void func2(){
        super.func2();
        System.out.print("子类,func2()");
    }
    public void fun4(){
     super.func1();
     func2();
     System.out.println("子类,func4()");
    }
    public void func5(){
        System.out.println("子类:func5()");
    }

}

方法覆盖

如果子类中定义了一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法覆盖了父类的方法。

子类覆盖父类方法的条件

  • 子类的方法名称、返回类型以及参数列表必须一致
  • 子类方法不能缩小父类方法的访问权限
  • 子类方法不能抛出比父类方法更多的异常
  • 方法覆盖只存在于子类和父类之间,同一个类只能重载。
  • Java静态虚拟机把静态方法和所属的类的绑定,把实例方法和所属的实例绑定
  • 父类的静态方法不能被子类覆盖成为非静态方法
  • 子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法
  • 父类的私有方法不能子类覆盖
  • 父类的抽象方法可以被子类通过两种途径覆盖
  • 父类的非抽象方法可以被覆盖为抽象方法

注: 当子类覆盖了父类方法时,如果子类方法或者子类对象调用该方法时,一般认为调用的方法是子类的方法。而如果要调用父类的同名方法,则在子类中需要加上super。

public class PaClass{
//定义三个方法
    public void funcA(){
      System.out.println("父类:A运行");
    }
      public void funcB(){
      System.out.println("父类:B运行");
      funcA();//调用A方法
       System.out.println("父类:B结束");
    }
    public void funcC(){
         System.out.println("父类:C运行");
          System.out.println("父类:C结束");
    }
}
//SuClass类
public void SuClass extends PaClass{
   public void funcA(){
      System.out.println("子类:A运行");
       System.out.println("子类:A结束");
 }
 public void funcB(){
      System.out.println("子类:B运行");
      super.funcB();//调用父类的funcB()方法
       System.out.println("子类:B结束");
 }

public void funcC(){
     System.out.println("子类:C运行");
     funcA();  //调用子类的方法
     System.out.println("子类,C结束")
     
}
} 

在SuClass类中,定义了funcA()\funcB()\funcC()方法,覆盖了父类定义的三个方法。在SuClass类中的funcB()方法中,通过super修饰符调用了父类的funcB方法。再funC方法中未使用super,因此是调用它本身类的funcA方法。