Java——你还傻傻分不清重写(Override)与重载(Overload)?
1. 前言
复习了一段时间 Java SE 后,发现自己很多时候只是在机械的码代码,很少认真思考。借这次复习,把一些重要概念专门理一理,做一个记录。
1. 重写(Override)
重写是指在子类中对父类的方法的实现进行重新编写,定义特定于自己的行为。
重写父类方法需要注意以下几点:
- 只能重写父类中允许访问的方法,像父类的 private 方法是无法重写的;
- 重写后的方法的方法名、返回类型和形参列表都必须和基类的保持一致(子类方法的返回类型可以是父类方法的返回类型的子类);
- 重写后的方法的访问修饰权限必须大于等于父类方法的访问修饰权限;
- 重写方法不能抛出新的检查异常或者申明比被重写方法更加宽泛的检查型异常 ;
- 可以在重写的方法上加上
@Override
注解,以判断是否正确重写了父类方法。
代码示例如下:
class Super {
protected String doSomething() {
return "Super class do something";
}
}
class Sub extends Super {
/*
* 父类访问权限修饰符为 protected,
* 则子类重写的方法必须为 protected(等于) 或 public(大于)
*/
@Override
protected String doSomething() {
return "Sub class do something";
}
}
public class OverrideMethod {
public static void main(String[] args) {
Super x = new Super();
System.out.println(x.doSomething());
Super y = new Sub();
System.out.println( y.doSomething());
}
}/* Output
Super class do something
Sub class do something
*/
2. 重载(Overload)
方法重载一般发生在同个类中,方法名相同的方法如果分别具有独一无二的参数列表(可以是参数个数不同,也可以是参数类型不同,甚至可以是参数顺序不同)则视为重载。
重载方法需要注意以下几点:
- 重载的时候,返回值类型可以相同也可以不相同,不能以方法返回值类型区分重载方法;
- 重载的时候,可以声明新的或更广的检查异常;
- 重载可以发生在同一个类中或者子类中;
- 涉及基本类型的重载需要注意基本类型能从一个“较小”的类型自动提升至一个“较大”的类型。
代码示例如下:
public class OverloadingOrder {
static void f(String s, int i) {
System.out.println("String:" + s + ",int:" + i);
}
static void f(int i, String s) {
System.out.println("int:" + i + ",String:" + s);
}
public static void main(String[] args) {
f("String first", 11);
f(99, "Int first");
}
}/* Output:
String:String first,int:11
int:99,String:Int first
*/
3. 重载与重写的区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载一般发生在同一个类中,同名的方法,如果有不同的参数列表(参数类型不同、参数个数不同或参数顺序不同)则视为重载;重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表、兼容的返回类型、不小于父类被重写方法的访问权限、不能比父类被重写方法声明更多的异常。