重写与重载

  • 什么是重写
  • 什么是重载
  • 常见的面试题

什么是重写

子类对父类中已有的方法进行重新定义,让子类可以根据自己需要重新实现父类继承的方法

子类重新实现父类方法

重写要求:

        1. 子类重写方法必须与父类中被重写的方法具有相同的方法名称,返回类型和参数列表
        2. 子类重写方法的访问权限不能低于父类被重写的方法的访问权限
        3. 子类重写的方法不能抛出比父类被重写方法更多或更宽泛的异常
        4. 子类无法重写父类中被final关键词修饰的方法

需要重写的情况:

  1. 子类需要根据自己的需要来重新实现父类继承的方法,来实现自己特有的功能
  2. 父类中的方法对于子类来说并不合适,需要重新实现
  3. 父类的方法存在缺陷或需要改进,子类需要重新实现以改进原有功能

特殊情况:重写方法的返回值类型可以是父类方法返回值类型的子类,这个特性在java5后出现,也被称作是Java中的”协变返回类型”

需要满足:

    1. 返回值类型为父类返回类型的子类
    2. 方法参数列表及访问修饰符都与父类方法相同或更为宽松

什么是重载

在同一个类中,可以定义多个具有相同方法名但是参数类型,参数顺序或参数个数不同的方法,即不同的方法签名对应不同的方法体

定义重名但是参数不同的方法

重载要求:

           1. 方法名必须相同
           2. 参数列表必须不同,比如参数类型不同,参数顺序和参数个数
           3. 方法返回类型可以不同,但这不能作为区分两个方法是否相同的依据
           4. 访问修饰符和异常类型的不同不足以构成方法重载

需要重载的情况:

  1. 在同一个类中,需要定义多个具有相同方法名但参数类型,参数顺序或参数不同的方法,以便根据不同的参数组合来执行不同的操作
  2. 在继承体系中,子类需要重新定义父类已有的方法,并且需要使用父类方法相同的方法名,但是参数类型,参数顺序或参数个数可能不同。重载拓展了Java方法命名的灵活性和可读性,提高了程序代码的可重用性,可扩展性和维护性。依据实际需求,合理的使用方法重载可以让程序更加简洁,优雅和高效

常见的面试题

  1. 重载和重写的区别是什么?

答:重载(Overloading)指在同一个类中,可以定义多个具有相同方法名但参数类型、参数顺序或参数个数不同的方法。而重写(Override)指在继承体系中,子类重新实现其父类中已有的方法。重载和重写的最大区别就是重载是同一个类中的方法之间的多态,而重写则是子类覆盖父类的方法实现,实现多态的一种方式。

  1. 方法的返回值类型是否可以作为重载的区分标准?

答:不能。重载的区分标准必须基于参数列表的不同,而不能基于方法的返回值类型。因为重载方法的返回值类型并不影响编译器调用哪个方法,它只是方法的属性之一,并不应该作为重载的区分标准。

  1. 子类可以继承父类的私有方法吗?

答:不可以。父类中的私有方法对子类而言是不可见的,并且没有任何继承的意义,因此子类也无法重写私有方法。如果需要在子类中使用父类中的某个方法,可以将其定义为受保护的或公共的方法。

  1. 在一个类中,可以同时存在重载和重写吗?

答:可以。在一个类中,可以定义多个同名方法并且它们的参数列表不同,这就是方法的重载;同时,如果子类需要重新实现父类中已有的方法,则可以通过方法的重写来实现。这两个概念并不冲突,而是Java中非常重要的面向对象编程特性。

  1. 什么是抽象方法?它们可以被重载吗?

答:抽象方法指在一个抽象类或接口中声明的但没有实现的方法,它没有具体的方法体,只有方法签名。因为抽象方法没有实现,所以不能直接调用,必须由子类来实现具体的方法体。因为子类需要覆盖实现父类中的抽象方法,所以它们不能被重载,只能被重写。