不可重写私有方法。
不可重写非静态的方法,虽然编译器不会报错,但是得不到预期的结果。
可以通过重写的形式对父类的功能进行重新定义,比如:对功能进行修改或者进行升级时。
public void showMsg(){System.out.println("BaseAction.showMsg");}public void getName(){System.out.println("BaseAction.getName:张三");} }class Main{public static void main(String[] args){BaseAction b = new BaseAction();b.showMsg();b.getName();} }
运行结果:
BaseAction.showMsg
BaseAction.getName:张三
现在在Main类中调用BaseActiond的showMsg方法需要改造,但是showMsg方法在其余的地方也用到了,不可直接改变showMsg中的代码,这个时候就需要用重写。
public void showMsg(){System.out.println("BaseAction.showMsg");}public void getName(){System.out.println("BaseAction.getName:张三");} }class UserAction extends BaseAction{public void showMsg(){System.out.println("UserAction.showMsg");}}class Main{public static void main(String[] args){//BaseAction b = new BaseAction();UserAction b = new UserAction();b.showMsg();b.getName();} }
运行结果:
UserAction.showMsg
BaseAction.getName:张三
重写后的代码,在Main类中并不影响getName,只对showMsg方法做了改变。
@Override的用法
@Override是伪代码,写和不写都可以,不过写上还是有很多好处的,可以很清楚的看出这个是重写方法,而且编译器也会验证该方法在父类中是否存在。当你想重写一个方法时,但是没有写上@Override,如果方法名称或者参数写错了,编译器也不会报错,会认为这是子类中定义的一个方法或是在重载一个方法。
public void findAll(String name){System.out.println("BaseAction.findAll");} }class UserAction extends BaseAction{@Overridepublic void findAll(String name){System.out.println("UserAction.findAll");} }
public void findAll(String name){System.out.println("BaseAction.findAll");} }class UserAction extends BaseAction{public void findAll(int name){System.out.println("UserAction.findAll");} }class Main{public static void main(String[] args){UserAction u = new UserAction();u.findAll("1");u.findAll(1);} }
运行结果:
BaseAction.findAll
UserAction.findAll
如果在UserAction中的findAll()方法上不加上@Override,编译器也不会报错,但是变成了方法重载。如果在UserAction中的findAll()方法上加上@Override,编译器就会提示错误。