访谈合集:https://gitee.com/mydb/interview方法重写(Override)和方法重载(Overload)是面向对象编程中多态特性的不同表现形式,但两者本身并无关联,它们的区别就像马德华和刘德华的区别,除了名字长得像,其他的一点都不像。接下来,我们就来看看两者的具体区别。1、方法重写方法重写(Override)是一种语言特性,是多态性的具体体现。它允许子类重新定义父类中已有的方法,并且子类中的方法名和参数类型以及个别值的个数必须和父类一致,这就是方法重写。1.1基本用法方法重写的基本用法如下:/***父类中有method方法*/classFather{publicvoidmethod(Stringname){System.out.println("Father:"+姓名);}}/***子类重写了父类的method方法*/classSonextendsFather{@Overridepublicvoidmethod(Stringname){//打印的行为在子类中重新定义,不再是Father:XXX,但是儿子:XXXSystem.out.println("儿子:"+名字);}}1.2使用场景方法重写Java中的很多场景,其中Object类中的equals方法比较经典。Object是所有类的父类。Object类中equals方法的实现源码如下:从上面的源码可以看出,Object类中的equals是用来比较两个对象的引用地址是否相同的。但是对于字符串来说,是被final修饰的,所以每次创建的字符串引用地址都不一样,那么此时比较引用地址是没有意义的,所以String类必须重写父类中的equals方法Object,具体源码如下:通过上面的代码我们可以看出String中的equals方法不再比较两个字符串的引用地址是否相同,而是判断两个字符串的值是否相同相同。1.3注意事项重写方法时要注意5点:注1:子类方法的权限控制符号不能减少,即如果父方法的权限控制符号被保护,那么子类的方法权限控制字符只能是protected或者public;注2:子类方法返回的类型只能归约,也就是说如果父类方法返回Number类型,那么子类方法只能返回Number类型或者Number类子类的Long类型Number类型的不能返回;注3:子类抛出的异常类型只能reduced;注意4:子类的方法名必须和父类的方法名一致;注意5:子类方法的参数类型和数量必须与父类一致。2、方法重载方法重载是指在同一个类中,定义了多个同名方法,但同名方法的参数类型或参数个数不同。2.1下面四种方法的基本使用是方法重载:/doSomething}publicstaticvoidmethod(Integerid,Stringname){//doSomething}}2.2使用场景方法重载的经典使用场景是String类型的valueOf方法。valueOf方法重载的实现有9种,如下图所示:它可以将数组、对象和基本数据类型转换成字符串类型。2.3注意事项方法重载的优先匹配原则有以下五种:第一种匹配原则:首先匹配相同的数据类型,方法重载会优先调用方法参数相同类型的方法,例如如果只有一个String类型的参数被调用时,会优先匹配只有一种String参数类型的重载方法;第二种匹配原则:如果是基本数据类型,会自动转换成更大的基本数据类型进行匹配。比如调用的参数是int类型,那么会先调用基本类型long,而不是wrapper类型Integer(这个需要特别注意,容易出错)。第三个匹配原则:自动装箱和自动拆箱匹配,参数调用也会进行自动拆箱和自动装箱的方法匹配,比如传入int类型作为调用参数,那么就可以匹配重载的方法Integer类型的;第四条匹配原则:会按照继承路线向上匹配父类。如果当前类无法匹配,则尝试匹配其父类,或父类的父类,依次匹配;第五个匹配原则:可以变参匹配,如果方法是可选参数方法,那么它的调用优先级最低,最后阶段才会匹配可选参数方法。方法重载会按照以上5个原则依次匹配,符合规则的方法先被调用。除了以上匹配原则外,还需要特别注意的是,不同的返回类型不能作为方法重载的依据,即不同的返回值类型不算方法重载。关于这一点的详细介绍可以参考:https://mp.weixin.qq.com/s/4pi1OZx8So6GjHD6yxjB3Q3。MethodOverridingVSMethodOverloading方法重写和方法重载的具体区别主要体现在以下六个方面:方法重载方法重载和方法关系描述的区别是父类和子类的方法关系。它描述了同一个类中多个同名方法之间的方法关系。Override关键字需要用@Override关键字修改。参数类型和参数个数不能修改。返回类型必须修改,只能更改。小或者一样,不能改变,可以修改,抛出的异常只能减少或者删除,不能抛出新的或者更大的异常,只能修改,不能修改。总结方法覆盖(Override)和方法重载(Overload)是面向对象编程中多态特性的不同表现形式。方法重写描述的是父类和子类之间的方法关系,而方法重载描述的是同一个类中的多个方法。同名方法的方法关系。除了方法重写和方法重载之外,还有:Override关键字、参数类型和参数个数、返回类型、抛出的异常和权限控制字符。判断是非在己,名誉在人,得失在数。公众号:Java面试真题解析
