Java中的Overload(重载)与Override(重写、覆盖)

java中的方法重载发生在同一个类中两个或者多个方法的方法名相同但是参数不同的情况,方法重载是指子类与父类之间子类重新定义了父类的方法,重写的方法与原方法签名、返回值、参数完全相同。
Overload(重载)

  • 重载Overload是一个类中多态性的一种表现,是编译时的多态性。方法重载是让类以统一的方式处理不同类型数据的一种手段。重载发生在同一个类中。同名的方法如果有不同的参数列表(参数个数、类型)则视为重载。
  • java方法的重载,就是可以在类中创建多个方法,这些方法具有相同的名字,但具有不同的参数列表。调用方法的时候通过传递的参数个数和参数类型的不同来决定具体使用哪个方法,这就是多态性的体现。
  • 重载的时候返回值的类型可以相同也可以不同,无法以返回值的类型来作为重载函数的区分。
  • 不能通过访问权限来进行重载。

Override(重写、覆盖)

  • 子类与父类之间的多态性,对父类的方法进行了重新定义,是运行时的多样性。如果在子类中定义的某方法与其父类具有相同的名称和参数,我们说该方法是重写的方法。在java中,子类可以集成父类的方法而不需要重新编写相同的方法。但有时子类并不想原封不动的集成父类的方法,而是想做一定的修改,这就需要采用方法的重写。方法重写又称为方法覆盖。
  • 若子类中的方法与父类中的某一方法具有相同的方法名、参数列表和兼容的返回类型,则新方法将覆盖原有的方法。如需父类中原有的方法,可以使用super关键字,该关键字引用了当前类的父类。
  • 子类方法的访问修饰权限不能少于父类的。

多提一句,C#中重写时父类的方法必须为虚方法或者抽象方法。
总结:

  • 重写(覆盖)的规则:
  • 重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载。
  • 重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)
  • 重写的方法的返回值必须和被重写的方法的返回一致或者兼容
  • 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类
  • 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
  • 静态方法不能被重写为非静态的方法(会编译出错)。
  • 父类方法被final时,无论该方法被public、protected及默认所修饰,子类均不能重写该方法。

重载的规则:

  • 在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样)。
  • 不能通过访问权限、返回类型、抛出的异常进行重载。
  • 方法的异常类型和数目不会对重载造成影响。

联系与区别:
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

  • 当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定.
  • 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法
  • 属性只能被隐藏,不能被覆盖。
  • 类实例变量/静态变量可以隐藏父类的实例/静态变量。

隐藏与覆盖的区别:

  • 被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性。
  • 被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法。
  • 因为覆盖是动态绑定,是受RTTI(run time type identification,运行时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏。
posted @ 2018-04-11 20:35  王小豆又叫小王子  阅读(359)  评论(0编辑  收藏  举报