Java方法重载与重写

重载

发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。

class Ideone {
	public static void main (String[] args) throws java.lang.Exception {
		Ideone i = new Ideone();
		System.out.println(i.test());
		System.out.println(i.test(2));
	}
	
	public int test() {
		return 1;
	}
	
	private double test(int n) {
		return (double) n;
	}
}

重写

重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

  1. 方法名、参数列表必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
  2. 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
  3. 构造方法无法被重写

如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。

总结

综上:重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。

区别点 重载 (Overloading) 重写 (Overriding)
发生范围 同一个类中。 父类与子类之间(存在继承关系)。
方法签名 方法名必须相同,但参数列表必须不同(参数的类型、个数或顺序至少有一项不同)。 方法名、参数列表必须完全相同
返回类型 与返回值类型无关,可以任意修改。 子类方法的返回类型必须与父类方法的返回类型相同,或者是其子类
访问修饰符 与访问修饰符无关,可以任意修改。 子类方法的访问权限不能低于父类方法的访问权限。(public > protected > default > private)
绑定时期 编译时绑定或称静态绑定 运行时绑定 (Run-time Binding) 或称动态绑定