重写:子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。子类和父类的方法必须要一致,方法体不同。即外壳不变,核心重写。
重写都是方法的重写,和属性无关。
静态方法(声明为 static 的方法 )不能被重写,但是能够被再次声明。
一、方法的重写
我们首先了解一下方法的重写。如下所示,在B类中声明一个方法 test():
public class B {
public void test(){
System.out.println("B=>test()");
}
}
A是B的子类,键盘敲击 alt+insert
,选择 Override Methods
,重写方法,代码如下所示:
public class A extends B{
@Override
public void test() {
super.test();
}
}
我们将 super.test();
修改成自己想要的方法体,则完成了方法的重写。如下所示:
public class A extends B{
@Override
public void test() {
System.out.println("A=>test()");
}
}
此时我们在主类中进行输出,代码如下所示:
public class Application {
public static void main(String[] args) {
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A(); //子类重写了父类的方法
b.test();
}
}
输出结果如下所示:
A=>test()
A=>test()
我们可以看到,输出的都是子类的方法。这就是方法的重写。
二、static静态方法无法重写
如果A类和B类中的 test()方法都是static的,那么就无法重写。 当test方法都是static的情况下,我们在主类中进行输出,代码如下:
public class Application {
public static void main(String[] args) {
//static静态方法的调用,只跟左边定义的数据类型有关
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();
b.test();
}
}
输出结果如下所示:
A=>test()
B=>test()
即左边定义的数据类型,决定了具体调用的方法。数据类型为A,则调用A中的方法。数据类型为B,则调用B中的方法。
三、方法重写特点总结
重写:Alt+Insert:Override
需要有继承关系,子类重写父类的方法。
为什么需要重写:父类的功能,子类不一定需要,或者不一定满足。
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大,但不能缩小
public>protected>default>private - 抛出的异常:范围可以被缩小,但不能扩大:
ClassNotFoundException(找不到该类的异常,范围小) --> Exception(大)