方法重载(overload)与方法重写(override)
2019-10-08 09:12:23来源:博客园 阅读 ()
方法重载(overload)与方法重写(override)
一、方法重载:
在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可。注意方法重载与返回值类型、访问权限修饰符、和抛出的异常无关。重载是在本类中,与继承关系无关。
(1)为什么要进行方法重载?
刚刚接触java的同学,可能会对方法重载的用处有点疑惑。方法重载最经典的就是构造器了,我们知道构造器是和类名一致的,但我们要用不同的方式来实例化对象时,单一的构造器已经不能满足我们的要求,所以这时就用到了方法重载,方法重载起源于构造器。
当然除了构造器之外我们也可以在其他方法中用到方法重载,例如一个程序完成两个数相加,如果不用方法重载时,我就需要写n个方法,给n个方法起n个方法名,在调用时我不知道该调用哪一个,然后翻来翻去才找到,这很不利于别人来使用这些方法。原本这些方法完成的功能都是一致的,为了统一管理和调用方便,所以引入方法重载这一概念。
public class Test { //方法1 public static int add(int a, int b) { return a + b; } //方法2 public static double add(int a, double b) { return a + b; } //方法3 public static double add(double a, int b) { return a + b; } //方法4 public static int add(int a, int b, int c) { return a + b + c; } //方法5 public static int add(int... a) { int temp = 0; for(int i = 0; i < a.length; i++) { temp += a[i]; } return temp; } public static void main(String[] args) { } }
如上面的代码,有因为不同数据类型的重载、有参数位置不同的重载、有参数个数不同的重载。由此看来重载还是很强大的。
(2)重载方法的调用
有了方法,我们就要想该怎样使用这些方法,当我们传实参时,编译器会调用哪个方法呢?这其中就有一个匹配度的问题,编译器会自动调用高匹配度的那个方法,例如:当我add(1,1);时会调用方法1,因为他的匹配度为100(安全匹配)。当然编译器找不到那个完全匹配的方法,会调用实参类型能够自动转化成形参类型的那个方法(兼容性匹配)。但这也就引发了问题,当我把方法1去掉,再调用add(1,1);这时会调用哪个方法?答案是编译器会报错。因为方法2与方法3的匹配度是相同的,引起了冲突。
最后方法重载支持可变参数重载,可变参数本身就相当于一个数组,在匹配中他的匹配度是最低的,当其他方法不满足时,才会调用可变参数方法。
二、方法重写:
方法的重写与方法的重载没有一点关系,硬要说有关系,那就是它们很容易被弄混。
class Person{ public void say() { System.out.println("人说话"); } } public class Student extends Person{ @Override public void say() { System.out.println("学生说话"); } }
(1)为什么要进行方法重写:
方法的重写发生在继承关系中,在继承中子类可以继承父类中的除了构造器、静态属性、静态方法、内部类、代码块外的所有东西。方法也不例外,但是如果父类的方法并不能满足我的需求,这时候子类就需要对父类的方法进行改造扩充,这就是方法的重写。
(2)方法重写遵循的规则:(下面的大于和小于是一种描述习惯)
1.重写的方法与被重写的方法的方法签名要一致
2.子类重写方法的访问权限必须大于等于父类方法的访问权限,例如父类方法用public修饰,那么子类方法也必须用public修饰。
3.重写与被重写的方法不能被static与final修饰
4.子类抛出的受检异常不能大于父类的受检异常(注意只针对受检异常,非受检异常没有此限制)
5.子类的方法的返回值类型可以小于等于父类的返回值类型
6.子类不能重写父类的private方法,添加@override注解会报错,因为这个方法是父类私有的子类不能访问,虽然子类继承了这个方法,但是子类只有拥有权没有使用权。如果去掉@override注解就不会再报错,所以说进行方法重写时要记得添加@override注解,让编译器帮助你做检查。
当以个方法被子类重写了,调用这个方法时,调用的时重写后的方法,但如果你就是想调用原来的方法,可以通过super关键字来实现。super关键字是一个标识,代表父类内存空间的标识。super可以用于访问父类中定义的属性,可以用于调用父类中定义的成员方法(例如toString中可以调用父类的toString然后再拼接上子类的特有的东西)、可以在子类中调用父类的构造器(后面详细说明)。
文章中有不对的地方,请批评指正!
原文链接:https://www.cnblogs.com/baijian/p/11622151.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:RabbitMQ和Kafka对比
- 类的继承,方法重新中修饰符如何定义 2020-06-10
- java里面main方法中的String[]args 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- 学习笔记之方法引用 2020-06-06
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash