重载(Overload)
发生在同一个类中,当某一个类中需要有多个同名方法时,为了提高方法名的复用率,便会用到重载。
重载的定义为:两个或多个方法的方法名相同、返回值类型相同,但是参数列表不同(参数列表不同包括三种情况:1.参数类型不同;2.参数数量不同;3.参数顺序不同)。比如在一个类中,通常会有无参构造方法和有参构造方法,这些构造方法的返回值类型(无)和方法名(类名)均相同,但是在参数列表中,无参构造没有参数,有参构造有参数,而且可能会有多个不同参数列表的有参构造,因此这些构造方法就可以认为是一种方法重载。
重载多用于方法重载、运算符重载等。从多态的角度来说,方法重载其实是一个类内部多态性的表现,体现了编译时的多态性。
重写(Override)
通常发生在父子类继承或多态过程中。
在继承中,如果一个子类需要实现一个和父类相同的方法,但是具体实现内容又不完全相同,就可以重写父类中的该方法,对实现内容做改写。但要注意的是,子类在重写时要保证此方法与父类的方法名和参数列表完全相同、返回值类型兼容且访问修饰符的权限要大于父类。
重写也是发生多态的一个必要条件,通常发生多态要满足三个条件:1.要有继承关系;2.子类需要重写父类的抽象方法;3.父类引用指向子类对象。就重写而言,一般是在父类中存在一个抽象方法(此时该类称为抽象类),这个抽象方法在父类中只做声明,不做任何实现。子类在继承了父类的方法属性之后,需要对该抽象类做具体的实现,否则子类也将变为抽象类。
因此重写可以理解为子类对父类中的某一个方法做了重新的实现。
从多态性的角度考虑,对于多个子类,它们都需要重写父类中的抽象方法,而不同子类间重写该方法的目的是为了分别对其做具体的实现,以满足各自对该方法的应答。重写是多态性的一个前提要求,与此同时,又体现了不同子类对父类中同一方法的不同实现和应答,是运行时多态性的体现。
重载和重写的关联
两者之间没有任何实质性的关联,但是从多态思想上来看,两者其实是多态性的两方面表现:重载表现为同一个类中对同名方法的多态性,是编译时多态性的体现;而重写表现为父类中某一同名方法对不同子类产生的多态性,是运行时多态性的体现。