重载(overload):
对于类的方法(包括从父类中继承的方法),
方法名相同
,
参数列表不同
的方法之间就构成了重载关系。
覆盖 (override):
也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。
当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了。
发生覆盖的条件:
1、“三同一不低” 子类和父类的方法名称,参数列表,返回类型必须完全相同,而且子类方法的访问修饰符的权限不能比父类低。
2、子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出;
3、被覆盖的方法不能是final类型的。因为final修饰的方法是无法覆盖的。
4、被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
5、被覆盖的方法不能为static。所以如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
父类引用指向子类对象注意事项:
1、该引用只能调用父类中定义了的方法和变量
2、如果子类中重写了父类中的一个方法,那么在调用这个方法时将会调用子类中的这个方法,如果没有重写将会调用父类中的这个方法。
3、变量不能被重写,如果重写就会报错。
4、jvm会根据定义的类型来判断是否需要捕获异常,而不是其实际类型,编译时,编译器只知道你是定义的类型,而非创建的这个类型。
Java的重载机制: 重载的实质:在一个类中使用签名相同的多个方法。 按照范围,可以将重载分为在一个类中重载,和在子类和父类中重载。现分别解释如下: 1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表,比如一个类的构造函数。 2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表),这个地方很容易和重写相混淆,因此千万注意。 重载的规则主要记住亮点: 1、是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序。 2、是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改。实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字。