乐趣区

关于java:Java中方法重写和方法重载的6个区别

面试合集:https://gitee.com/mydb/interview

办法重写(Override)和办法重载(Overload)都是面向对象编程中,多态个性的不同体现,但二者自身并无关联,它们的区别犹如马德华之于刘德华的区别,除了名字长得像之外,其余的都不像。

接下来咱们就来扒一下二者的具体区别。

1. 办法重写

办法重写(Override)是一种语言个性,它是多态的具体表现,它容许子类从新定义父类中已有的办法,且子类中的办法名和参数类型及个数都必须与父类保持一致,这就是办法重写。

1.1 根本用法

办法重写的根本用法如下:

/**
 * 父类中有一个 method 办法
 */
class Father {public void method(String name) {System.out.println("Father:" + name);
    }
}
/**
 * 子类中重写了父类的 method 办法
 */
class Son extends Father {
    @Override
    public void method(String name) {
        // 子类中从新定义了打印的行为,不再是 Father:XXX,而是 Son:XXX
        System.out.println("Son:" + name);
    }
}

1.2 应用场景

办法重写在 Java 中利用的场景有很多,其中比拟经典的是 Object 类中的 equals 办法。
Object 是所有类的父类,equals 办法在 Object 类中的实现源码如下:

从上述源码能够看出,Object 类中的 equals 是用来比拟两个对象的援用地址是否雷同的。
但对于字符串来说,它是被 final 润饰的,所以每次创立的字符串援用地址都不同,那这时比拟援用地址就没意义了,所以 String 类必须重写父类 Object 中的 equals 办法,具体源码如下:

通过上述代码咱们能够看出,String 中的 equals 办法,曾经不是比拟两个字符串的援用地址是否雷同了,而是判断两个字符串的值是否雷同。

1.3 注意事项

在办法重写时须要留神的事项有以下 5 个:

  • 注意事项 1:子类办法的权限控制符不能变小,也就是如果父类办法的权限控制符是 protected,那么子类的办法权限控制符只能是 protected 或 public;
  • 注意事项 2:子类办法返回的类型只能变小,也就是说如果父类办法返回的是 Number 类型,那么子类办法只能返回 Number 类型或 Number 类的子类 Long 类型,而不能返回 Number 类型的父类类型 Object;
  • 注意事项 3:子类抛出异样的类型只能变小;
  • 注意事项 4:子类办法名必须和父类办法名保持一致;
  • 注意事项 5:子类办法的参数类型和个数必须和父类保持一致。

    2. 办法重载

    办法重载是指在同一个类中,定义了多个同名办法,但同名办法的参数类型或参数个数不同就是办法重载。

    2.1 根本应用

    以下 4 个 method 办法就是办法重载:

    public class OverloadExample {public static void method() {// doSomething}
    
      public static void method(String name) {// doSomething}
    
      public static void method(Integer id) {// doSomething}
    
      public static void method(Integer id, String name) {// doSomething}
    }

    2.2 应用场景

    办法重载的经典应用场景是 String 类型的 valueOf 办法,valueOf 办法重载有 9 种实现,如下图所示:

    它能够将数组、对象和根底数据类型转换成字符串类型。

    2.3 注意事项

    办法重载的优先匹配准则有以下 5 个:

  • 第 1 匹配准则:优先匹配雷同数据类型,办法重载会优先调用和办法参数类型截然不同的办法,比方只有一个 String 类型的参数调用,会优先匹配只有一个 String 参数类型的重载办法;
  • 第 2 匹配准则:如果是根本数据类型,会主动转换成更大的根本数据类型进行匹配,比方 调用的参数是 int 类型,那么会优先调用根本类型 long,而非包装类型 Integer(这点须要非凡留神,容易出错)。
  • 第 3 匹配准则:主动装箱和主动拆箱匹配,参数调用也会进行主动拆箱和主动装箱的办法匹配,比方调用参数传递的是 int 类型,那么它能够匹配到 Integer 类型的重载办法;
  • 第 4 匹配准则:会依照继承路线顺次向上匹配父类,如果匹配不到以后类,会尝试匹配它的父类,或者是父类的父类,顺次往上匹配;
  • 第 5 匹配准则:可变参数匹配,如果办法是可选参数办法,那么它的调用优先级是最低的,在最初阶段才会匹配可选参数办法。

办法重载会依照以上的 5 个准则顺次进行匹配,合乎规定的办法会被优先调用。除了以上匹配准则之外,还须要非凡留神一点,不同的返回类型不能作为办法重载的根据,也就是不同的返回值类型不算办法重载,对于这一点的具体介绍可参考:https://mp.weixin.qq.com/s/4pi1OZx8So6GjHD6yxjB3Q

3. 办法重写 VS 办法重载

办法重写和办法重载的具体不同,次要体现在以下 6 个方面:

区别 办法重写 办法重载
办法关系 形容的是父类和子类的办法关系 形容的是同一个类中多个同名办法的办法关系
Override 关键字 须要应用 @Override 关键字润饰 不须要
参数类型和参数个数 不能批改 必须批改
返回类型 只能变小或雷同,不能变大 可批改
抛出异样 只能变小或删除,不能抛出新的或者更大的异样 可批改
权限控制符 只能变大,不能变小 可批改

总结

办法重写(Override)和办法重载(Overload)都是面向对象编程中,多态个性的不同体现,办法重写形容的是父类和子类的办法关系,而办法重载形容的是同一个类中多个同名办法的办法关系。除此之外办法重写和办法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异样和权限控制符等不同点。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java 面试真题解析

退出移动版