第七天 继承之方法重写

方法重写又称方法覆盖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层次含义

  1.            子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法(关键所在)

  2.             当然这个不是硬性的规定而是一个建议,增加新的功能,尽可能不去重载父类的方法,而是尽力添加新的方法

  3.             子类可以增加自己的特有方法

  4.             子类实现父类的方法时,方法的形参不父类更加宽松.

  5.             子类实现父类方法时,方法的返回值比父类更加严格


猜你喜欢

转载自blog.51cto.com/10760006/2156124