方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
简单的说就是每个被重载的方法必须有独一无二的参数列表。
方法重载一个常见的使用场景就是类构造器。因为构造器方法名肯定是与类名相同,所以一个类中只会有一个构造器名。但是很多时候你都需要通过不同的方式创建一个对象,这个时候就需要使用到方法重载。
例如 HashMap 的构造器,代码示例:
public HashMap() { // 忽略内容 } public HashMap(int initialCapacity) { // 忽略内容 } public HashMap(int initialCapacity, float loadFactor) { // 忽略内容 }
当然下面的代码也是可行的,但是并不建议这样做,这样会导致代码难以维护等问题。如果你这样做了,回家的路上请小心。
public static void print(int a, String b) { System.out.println("int " + a + " ,String " + b); } /** 参数顺序不同 */ public static void print(String a, int b) { System.out.println("String " + a + " ,int " + b); }
如果你仔细阅读了上文,你会发现不能通过区分返回值来重载方法。
/** 这个方法会出现错误:已经在当前类定义过 */ public static void print(int a, String b) { System.out.println("int " + a + " ,String " + b); } public static String print(int a, String b) { System.out.println("int " + a + " ,String " + b); }
因为在调用的时候虚拟机可以通过参数的不同来区分同名的方法,但是在代码编写过程中,你可能会忽略方法的返回值的接收,使用下面代码来调用一个有返回值的方法,这时候虚拟机就不能确定你想调用的是同名方法中的哪一个。
print(1, "abc");
方法重写指子类中出现了和父类中一模一样的方法声明。
当子类需要父类的功能,而子类又有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
public class Fruit { public void show() { System.out.println("可以吃"); } } public class Apple extends Fruit { @Override public void show() { System.out.println("变得红彤彤"); super.show(); } }
区别点 | 方法重载 | 方法重写 |
---|---|---|
参数列表 | 必须不同 | 必须相同 |
返回类型 | 可以不同 | 必须相同 |
异常 | 可以不同 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以不同 | 不能降低访问限制 |