@Override是语义的检查,IDE会检查父类是否存在对应的方法,如果有,则检查是否允许覆写,如果是final则不允许,否则编译成功。
但是在子类覆写的方法调用super则没有了覆写的意义,而具有扩展的意义,因为你并没有取代父类的方法而是在其结果后执行了自己增加的行为
public class SuperClass { public void save() { // Perform save logic } } public class SubClass extends SuperClass { private Object b; @Override public void save() { super.save(); // Performs the save logic for SuperClass save(b); // Perform additional save logic } }
但是注意,如果父类的save方法中调用了其他的方法,且被子类覆写,那么只会调用子类的方法,因为此时只有一个this,那就是子类本身,super中的this此时已经动态链接到了子类,
任何的调用,都与父类无关,所以除非是构造函数,通常在成员函数中调用super是一种坏的味道,因为这个时候,你已经无法控制其真实的行为。