我们在平时开发的时候经常会遇见这样一个问题,方法的重载和重写,有时候经常搞混,这篇文章就是为了很好的去整理区分一下。
一个类中,可以有很多的构造方法,而且名字相同都是类名,其实这些方法就已经构成了重载。
也就是说,在一个类中,可以有很多名字相同的不同方法,现在一个问题来了,就是java是如何区分这些方法的呢?
什么是方法重载
其实区分重载,有一个很简便的方法,那就是每一个方法有一个独一无二的参数列表。
public class Son extends Father{ int fff(){ return 0; } String fff(int x,String y){ return ""; } void fff(String y,int x){}; public static void main(String[] args) { Son son=new Son(); } }
由以上代码可以看到:
1、参数个数不同可以区分
2、参数的顺序不同可以区分。
注意;返回值类型不同不能区分。
为什么返回值类型不同不能区分呢?这是因为有时候我们定义的方法,我们只是想要简单地去调用,而不想去获取他的返回值。
比如:在调用fff()时,只需要调用fff()或者是fff(1,”数据”)而不去获取他的返回值。这样jvm是无法区分的。
什么是方法重写
重写的概念
1、在子类中可以根据需要对从基类中继承来的方法进行重写。
2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。(注:返回值可以为父类中返回值的子类型.参数若为子类,则不是重写是重载)
3、重写方法不能使用比被重写的方法更严格的访问权限。
4、重写方法不能声明抛出比被重写方法范围更大的异常类型。
重写的例子
定义父类:
public class Father extends Grandpa { String add(int a,int b){ int c=a+b; return ""+c; } }
定义子类
public class Son extends Father{ String add(int a,int b){ int c=a+b; return ""+c; } public static void main(String[] args) { Son son=new Son(); } }
这样就完成了方法的重写。
重写方法的规则
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
重载方法的规则
1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常;
重写与重载的区别总结
1.重载
表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
2.重写
- 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了;
- 子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题;
- 子类方法的访问权限只能比父类的更大,不能更小;
- 如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》