上篇博客中讲到了Java中的继承,那么我们知道子类虽然能继承父类中的一部分方法,但但有时候,当父类方法已经不能满足子类对象的的特征是,父类方法就不再适用,这时就需要用到Java中的重写。
一、重写是什么?
子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。
二、如何重写?
举下面两段代码:
父类:
public class Father {
public Object eat(String a) {
System.out.println("用筷子吃饭");
return "meat";
}
}
未重写的子类代码:
public class Son extends Father{
public static void main(String[] args) {
Son son = new Son ();
son.eat("3");
}
}
子类运行结果:
子类程序照常运行了父类方法。
将子类方法重写:
public class Son extends Father{
@Override
public Object eat(String str) {
System.out.println("用刀叉吃饭");
return "rice";
}
public static void main(String[] args) {
Son son = new Son ();
son.eat("3");
}
}
提取出这一段代码:
@Override
public Object eat(String str) {
System.out.println("用刀叉吃饭");
return "rice";
}
这里首先反映出了Java中重写方法的一部分规则:
1.方法名相同,参数列表相同(个数和数据类型相同)
2.Java中用@Override标注重写后的方法,如果重写不成功,标注会报错。
3.public protected friendly private ,重写后的方法的访问权限只能和父类的相同或比父类的大。
错误示范:
当然,重写远远不止这么简单。重写还有如下规则,一一验证:
4.如果父类中方法用final修饰,则该方法无法被重写。
试错:
5.返回值,如果父类返回值为void类型或基本数据类型(byte short int long float double char boolean),则子类重写后方法的返回值必须与父类相同。如果父类返回值为引用类型,则子类返回值要么与父类相同,要么是父类返回值的类型的子类。
父类:
子类:
返回值为引用型时:
父类:
子类:
6.静态方法不能用来重写父类方法,也不能被作为父类方法重写。
报错:
父类为静态方法:
子类为静态方法:
综上,就是对Java继承中重写的详述。