问题出现:
即便对于一个经验丰富的开发人员来讲,方法重载和方法覆盖的区别都能让他犹豫一下, 对于新手来讲,常常容易弄混淆。 有没有比较深刻浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?
其余人是怎么作的:
写相似比较的博客很是之多,无非也就是分开介绍,而后比较区别。 好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。
能够这样理解:
override 更准确的翻译应该是推翻,重写。 overload 更准确的翻译应该是过载。 若是你不是新手,看到这个解释的时候应该有点茅塞顿开的感受, 由于直译以后的意思就是这两个方式的功能归纳。 因此: override 我的喜欢叫作方法重写; overload 我的喜欢叫作方法过载。
分析:
为何叫方法重写: 父类中的方法知足不了须要,子类能够推翻父类中的方法。 一样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。 因此方法重写要求很严格,除了方法体内部的实现和访问权限,其余的都要和父类中须要被重写的方法保持一致。 有一点要特别注意,方法重写以后访问权限能够不一样: 能够扩大访问权限,可是不能下降访问权限。 能够看做是对子类的兼容性和拓展性要求的折衷妥协吧。 注意:被重写的方法访问权限不能为 private,由于 private 修饰的方法子类没有访问权限,更不要提重写。 为何叫方法过载: 过载指的是应对不一样的参数列表而产生的方法过载。 因此方法过载要求方法名称必须相同,参数列表必须不一样; 访问权限,返回类型,抛出的异常之类的能够相同也能够不一样。 使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。 注意:若是某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载; 若是定义的话,也只是定义了一个新方法,而不会达到重载的效果。
练习一下:
class A { protected int method1(int a, int b) { return 0; } } public class B extends A{ public int method1(int a, int b) { return 0; } // private int method1(int a, int b) { return 0; } // private long method1(int a, int b) { return 0; } public short method1(int a, long b) { return 0; } private int method1(int a, long b) { return 0; } } (参考答案预警!你不打算在内心演算一下么?)
参考答案:
class A { protected int method1(int a, int b) { return 0; } } public class B extends A{ public int method1(int a, int b) { return 0; } // 正确,重写父类方法,能够扩大访问权限 // private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能下降了访问权限 // private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型 public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,能够有不一样的访问权限和返回值类型 private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,能够有不一样的访问权限和返回值类型 }
小结:
override 方法重写,也叫方法覆盖; 要求与被重写的方法: 名称相同, 参数列表相同, 返回类型相同, 抛出的异常相同(或者是父类抛出的异常的子类)。 被重写的方法访问权限不能为 private。 overload 方法过载; 要求过载的方法: 方法名称必须相同; 参数列表必须不一样; 访问权限,返回类型,抛出的异常能够相同也能够不一样。
传送门:http://blog.51cto.com/1350814...
本文系笔者原创
转载请注明出处
—————————————ide