java重写与重载
重写与重载
- 什么是重写
- 什么是重载
- 常见的面试题
什么是重写
子类对父类中已有的方法进行重新定义,让子类可以根据自己需要重新实现父类继承的方法
子类重新实现父类方法
重写要求:
1. 子类重写方法必须与父类中被重写的方法具有相同的方法名称,返回类型和参数列表
2. 子类重写方法的访问权限不能低于父类被重写的方法的访问权限
3. 子类重写的方法不能抛出比父类被重写方法更多或更宽泛的异常
4. 子类无法重写父类中被final关键词修饰的方法
需要重写的情况:
- 子类需要根据自己的需要来重新实现父类继承的方法,来实现自己特有的功能
- 父类中的方法对于子类来说并不合适,需要重新实现
- 父类的方法存在缺陷或需要改进,子类需要重新实现以改进原有功能
特殊情况:重写方法的返回值类型可以是父类方法返回值类型的子类,这个特性在java5后出现,也被称作是Java中的”协变返回类型”
需要满足:
1. 返回值类型为父类返回类型的子类
2. 方法参数列表及访问修饰符都与父类方法相同或更为宽松
什么是重载
在同一个类中,可以定义多个具有相同方法名但是参数类型,参数顺序或参数个数不同的方法,即不同的方法签名对应不同的方法体
定义重名但是参数不同的方法
重载要求:
1. 方法名必须相同
2. 参数列表必须不同,比如参数类型不同,参数顺序和参数个数
3. 方法返回类型可以不同,但这不能作为区分两个方法是否相同的依据
4. 访问修饰符和异常类型的不同不足以构成方法重载
需要重载的情况:
- 在同一个类中,需要定义多个具有相同方法名但参数类型,参数顺序或参数不同的方法,以便根据不同的参数组合来执行不同的操作
- 在继承体系中,子类需要重新定义父类已有的方法,并且需要使用父类方法相同的方法名,但是参数类型,参数顺序或参数个数可能不同。重载拓展了Java方法命名的灵活性和可读性,提高了程序代码的可重用性,可扩展性和维护性。依据实际需求,合理的使用方法重载可以让程序更加简洁,优雅和高效
常见的面试题
- 重载和重写的区别是什么?
答:重载(Overloading)指在同一个类中,可以定义多个具有相同方法名但参数类型、参数顺序或参数个数不同的方法。而重写(Override)指在继承体系中,子类重新实现其父类中已有的方法。重载和重写的最大区别就是重载是同一个类中的方法之间的多态,而重写则是子类覆盖父类的方法实现,实现多态的一种方式。
- 方法的返回值类型是否可以作为重载的区分标准?
答:不能。重载的区分标准必须基于参数列表的不同,而不能基于方法的返回值类型。因为重载方法的返回值类型并不影响编译器调用哪个方法,它只是方法的属性之一,并不应该作为重载的区分标准。
- 子类可以继承父类的私有方法吗?
答:不可以。父类中的私有方法对子类而言是不可见的,并且没有任何继承的意义,因此子类也无法重写私有方法。如果需要在子类中使用父类中的某个方法,可以将其定义为受保护的或公共的方法。
- 在一个类中,可以同时存在重载和重写吗?
答:可以。在一个类中,可以定义多个同名方法并且它们的参数列表不同,这就是方法的重载;同时,如果子类需要重新实现父类中已有的方法,则可以通过方法的重写来实现。这两个概念并不冲突,而是Java中非常重要的面向对象编程特性。
- 什么是抽象方法?它们可以被重载吗?
答:抽象方法指在一个抽象类或接口中声明的但没有实现的方法,它没有具体的方法体,只有方法签名。因为抽象方法没有实现,所以不能直接调用,必须由子类来实现具体的方法体。因为子类需要覆盖实现父类中的抽象方法,所以它们不能被重载,只能被重写。