首先掷出三个问题:为什么要重写?什么是重写?怎么重写?
1.为什么重写?
例子:比如父类方法中关于吃东西的方法eat,父亲由于年迈,只会用手抓饭吃。然而儿子在外见过世面,会使用筷子吃饭了。那么当儿子继承了父亲的eat方法后,儿子也只能用手抓饭。显然,父亲老套的用手抓饭的方法已经不能够满足儿子的吃饭方式了。换句话来说,就是当“不能准确形容子类自身的特征”的时候,这个时候我们要进行重写的操作。
2.什么是重写?
顾名思义,重新书写,或重新改写。
就是在子类中写一个跟父类一样的方法,但是这个方法有一些要求。
package sunnny;
public class Father
{
public void eat()
{
System.out.println("用手抓饭");
}
}
package sunnny;
public class Son extends Father{
public void eat() {
System.out.println("用筷子吃饭");
}
public static void main(String[] args) {
Son son=new Son();
son.eat();
}
}
这两段就是在子类中重写了eat方法,这时我们可以看到,输出结果是用筷子吃饭。
3.怎么重写?
重写不是简单地把父类的代码复制到子类里,他有一些形式上的要求。
-
返回值类型的要求:如果父类的返回值类型为基本数据类型或者是void,那么子类中的返回值类型必须和父类相同。 如果父类的返回值类型为引用数据类型,那么子类中返回值类型必须父类数据类型的子类或者相同。 object是所有引用数据类型的父类。
-
方法名和参数列表:要求子类与父类的方法名和参数的数据类型和个数必须相同。
-
访问权限:子类重写的方法不能缩小父类被重写方法的访问权限,子类重写方法的访问权限必须大于等于父类被重写方法的访问权限。访问权限由大到小排序:public protected friendly private,但注意父类不可以用private来修饰!
-
static:用于重写的父类和子类都不能用static来修饰!父类静态方法可以被继承,但是不能被重写。
-
final:父类中被final关键字修饰的方法可以被子类继承,但却不能被子类重写。
-
当重写了方法之后,必须调用父类方法的时候①对于非静态代码块或者方法,使用super调用。 ②对于静态代码块或方法,必须创建父类对象调用。
-
@Override:java为标注重写后的方法,使用@Override