黑马程序员技术交流社区
标题: 重载与覆盖 [打印本页]
作者: 郁金香大公爵 时间: 2015-7-24 09:23
标题: 重载与覆盖
在学习JAVA基础知识中,对Overload和Override 这两个单词感到很熟悉,在初次学习和练习中经常会使用和看到,那么下面我将对这两个单词在JAVA语言中的作用进行一个具体的描述并对这个知识阐述一下我自己的理解。
Overload:可以翻译为重载。重载是指对于类的方法:在类中我们可以定义一些函数名称相同的方法,通过定义不同的参数类型和参数个数来区分这些方法,这就称之为重载。方法名相同,参数列表不同的方法之间就构成了重载关系。
重载中还有三个方面需要注意:
(1)重载和返回值类型无关,判断类中的方法是否重载无需看返回值类型;
(2)何为参数列表不同?参数列表指三样东西:参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同;
(3)如果存在继承关系,那么对于继承关系来说,如父类中的某一个方法是有访问权限的,并用priavte进行对方法的修饰之后,那么就不能在子类对其方法进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
Override:可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。
除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了。
覆盖的具体地表现形式为:子类和父类的方法名称,参数列表,返回类型必须完全相同。
覆盖方法中注意事项:
1、子类方法覆盖父类方法:必须保证子类的访问修饰符的权限要大于等于比父类中的权限;
2、静态只能覆盖静态,并且覆盖的只能是成员函数,不能是成员变量;
3、被覆盖的方法不能是final类型的,因为被final修饰的方法是无法覆盖的;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖;
5、子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者是其子类;
介绍完覆盖和重载以后,下面我们来看一下覆盖和重载的异同点:
一、相同点:
1、都要求方法同名;
2、都可以用于定义抽象方法和非抽象方法;
二、不同点:
1、父类的一个方法只能被子类覆盖一次,而一个类中的方法可以在所有的类中可以被重载多次;
2、覆盖用于子类覆盖父类的方法或是实现接口中的方法,而重载则用于同一个类中所有的方法;
3、覆盖要求返回类型必须一致,重载对此没有要求;
4、覆盖要求参数列表必须一致,而重载要求参数列表必须不一致;
5、覆盖对方法的访问权限和抛出的异常有特殊的要求,而重载在这方面没有任何限制。
作者: xclyijin 时间: 2015-7-24 09:43
很细的知识点,之前没有专门去思考过他们的区别。
作者: helloworld79496 时间: 2015-7-24 10:34
好的。。。学到了。
作者: 一城一世界 时间: 2015-7-24 11:34
细心的孩子…
作者: 為了夢想 时间: 2015-7-24 11:54
学习学习
作者: 无与伦比的禽兽 时间: 2015-7-24 13:49
写的挺好的!
作者: 陈细杰 时间: 2015-7-24 14:43
总结的很到位,学习了。
作者: 孙晓磊 时间: 2015-7-24 14:53
个人感觉,覆盖神就神在可以super();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |