方法重写又称方法覆盖java中子类可以继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动的继承父类的方法而是想做一定的修改,着时候就需要采用方法的重写
方法覆盖的注意事项:
1权限:子类的的权限(访问修饰符)一定要不小于被重新的方法的权限(访问修饰符)
2方法定义:方法名和参数列表必须一样
3返回值:基本数据类型:子类和父类的必须一置
引用数据类型:子类可以与父类相同也可以是父类的子类
4抛出异常:子类抛出的异常不能超过父亲抛出的异常(子类的异常不能大于父类的异常)
5不能被继承就不能被重写
6不能重新final修饰的方法:
将方法或类声明为final主要的目的就是:确保他们不会改变语义.
7静态方法不能被重写.如果子类也有一个与父类同名同参也用static修饰,那么子类就会把继承来的父类方法隐藏而不是重写.简单来说父类和子类的方法是两个方法, 没有关系,也不存在多态的性质,静态方法是与类相关联的
父类的非静态方法不能被子类覆盖为静态方法,相反的父类的静态也不能覆盖为非静态
重载和重写的对比
重载:
权限修饰符(public private 默认):无关
方法名:重载的两个方法的方法名必须相同
形参列表:
形参类型的顺序不同
形参的个数不同
形参的类型不同
三者至少满足一个
返回值类型:
重载与返回值类型无关
重写:
权限修饰符(public private 默认):
子类方法的权限>=父类的方法的权限
方法名:
子类方法和父类方法必须相同
形参列表:
子类方法和父类方法的形参列表必须相同
返回值类型:
基本类数据类型:
必须相同
引用数据类型:
子类方法的返回值类型和父类方法的返回值类型相同
或者
子类方法的返回值类型是父类方法的返回值类型的子类
关于方法重载的一个原则
Liskov替换原则
核心抽象
为什么要有这个原则
一个功能p1,由父类完成,现在需要增加新的功能p2,继承之后,扩展为p3 这个p3是由p1和p2组成的,子类在完成新功能p2的时候可能使得p1发生故障
什么是这个原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
简单来说就是对于子类型必须能够替换掉他们的基类型,
再简单点:子类可以扩展父类的功能,但不能改变父类的功能
4层次含义
- 子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法(关键所在)
- 当然这个不是硬性的规定而是一个建议,增加新的功能,尽可能不去重载父类的方法,而是尽力添加新的方法
- 子类可以增加自己的特有方法
- 子类实现父类的方法时,方法的形参不父类更加宽松.
- 子类实现父类方法时,方法的返回值比父类更加严格
原文地址:http://blog.51cto.com/10760006/2156124