Java @Override详解

@Override 相关介绍。

在了解 @Override (重写)之前,需要先了解一下重写的概念。

重写:在子类继承父类时,有时需要将父类里面的方法进行重新编写,这个过程即为重写。重写前后的两个方法(即父类方法和子类方法)的名称、参数必须完全一致。假如子类的方法名称或参数与父类不同,那么就不认为这是重写,而是写了一个新的方法。

在编译时,子类对象重写之后的方法将会覆盖父类的方法。对于以下案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ./Test.java

public class Test {
public static void main(String[] args) {
Circle circle = new Circle();
circle.message();
}
}
class Sharp {
public void message() {
System.out.println("Sharp");
}
}
class Circle extends Sharp{
// @Override
// public void message() {
// System.out.println("Circle");
// }
}
/*
output:
Sharp
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ./Test.java

public class Test {
public static void main(String[] args) {
Circle circle = new Circle();
circle.message();
}
}
class Sharp {
public void message() {
System.out.println("Sharp");
}
}
class Circle extends Sharp {
@Override
public void message(){
System.out.println("Circle");
}
}
/*
output:
Circle
*/

第二个代码即为重写。对于 Java 而言,重写的方法之前即使不加 @Override 也能够编译通过,这是因为 @Override 仅仅是一个可以编译的注释(我自己创造的说法,是为了更好的解释)。在不添加时,编译器依然能够根据代码的逻辑判定为子类的方法重写了父类的方法。

在某种情况下,开发人员可能会不小心将需要重写的方法的名称或参数写错,但是编译器并不会进行提示,因为他会认为这是一个新的方法。

为了防止上述情况的发生,开发人员可在重写的方法前添加一行 @Override 以告诉编译器这是一个重写的方法,编译器如果找不到子类重写方法的父类方法,那么就会报错,以提醒开发人员父类中并没有这个需要重写的方法。而这就是我刚才说的可以编译的注释。接下来可以看一下对比:

注释 @Override
功能 提醒开发人员此处代码的功能 提醒编译器(和开发人员)这里是一个重写的方法
必要性 可以添加可以不添加,对正确的代码本身无影响 可以添加可以不添加,对正确的代码本身无影响
内容是否影响编译结果 不影响 影响,在重写的父类方法不存在时会报错

可以看出,@Override 相比于注释要多了一个功能,而这个功能可以说是将注释用于给开发人员查错的功能变成了注释用于给编译器查错的功能。从而节省了开发人员去手动检查重写方法正确性的作业量。

感谢您的支持
-------------本文结束感谢您的阅读-------------