一、什么是重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
二、private方法不能被重写
package rewrite;
class Person {
private void eat() {
System.out.println("Person吃饭");
}
}
class Student extends Person {
public void eat() {
System.out.println("stu吃饭");
}
}
public class rewrite {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person per = new Person();
per.eat();
Student stu = new Student();
stu.eat();
}
}
在学习继承的过程中,我们知道,如果在父类中修饰了一个private的方法,子类继承之后,对子类也是不可见的。子类重写则在编译阶段就会报错。
三、static方法不会被重写
public class staticTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father son = new Son(); //声明为Father类,son静态方法和Father类绑定
son.method();
son.staticMethod();
Son son2 = new Son();
son2.method();
son2.staticMethod();
}
}
class Father{
void method(){
System.out.println("父类方法");
}
static void staticMethod(){
System.out.println("父类静态方法");
}
}
class Son extends Father{
void method(){
System.out.println("子类方法");
}
static void staticMethod(){
System.out.println("子类静态方法");
}
}
首先要强调,静态方法是不会被覆盖的。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法类的任何实例都不相关,所以概念上不适用。
四、参考
Java 重写(Override)与重载(Overload)