不可重写私有方法。
不可重写非静态的方法,虽然编译器不会报错,但是得不到预期的结果。
可以通过重写的形式对父类的功能进行重新定义,比如:对功能进行修改或者进行升级时。
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{ @Override public 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,编译器就会提示错误。