java – 当覆盖时不调用super()方法?

当我创建自己的Android自定义类时,我扩展其本地类。然后当我想覆盖基础方法,我总是调用super()方法,就像我一直在onCreate,onStop等。

我认为这是它,因为从一开始Android团队建议我们总是调用super的每一个方法覆盖。

但是,在许多书中,我可以看到,开发人员,比我更有经验的人经常忽略调用super,我真的怀疑他们是因为缺乏知识。例如,看看这个基本的SAX解析器类,其中在startElement中省略了super,字符和endElement:

public class SAXParser extends DefaultHandler{
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equalsIgnoreCase("XXY")) {
            //do something
        }
    }

    public void characters(char[] ch, int start, int length) throws SAXException {
        //do something
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equalsIgnoreCase("XXY")) {
            //do something
        }else () {
            //do something
        }
    }
}

如果您尝试通过Eclipse或任何其他IDE创建任何覆盖方法,super将始终作为自动化过程的一部分创建。

这只是一个简单的例子。书里充满了类似的代码。

他们怎么知道什么时候你必须打电话超级,当你可以省略它打电话?

PS。不绑定到此特定示例。这只是从许多例子中随机抽取的一个例子。

(这听起来像一个初学者的问题,但我真的很困惑。)

通过调用super方法,你不会覆盖方法的行为,你要扩展它。

调用super将执行任何逻辑,你扩展的类已经为该方法定义。考虑到当你在你的方法调用super的实现重写的时候可能是重要的。例如:

public class A { 
    public void save() { 
         // Perform save logic
    }
}

public class B extends A {
    private Object b;
    @Override
    public void save() { 
        super.save(); // Performs the save logic for A
        save(b); // Perform additional save logic
    }
}

对B.save()的调用将按照这个特定的顺序对A和B执行save()逻辑。如果你没有调用super.save()在B.save(),A.save()不会被调用。如果你在保存(b)后调用super.save(),则A.save()将在之后有效地执行B.save()。

如果你想覆盖super的行为(也就是说,完全忽略它的实现并自己提供),你不应该调用super。

在你提供的SAXParser示例中,这些方法的DefaultHandler的implementations只是空的,所以子类可以覆盖它们并为这些方法提供一个行为。在javadoc这个方法这也被指出。

public void startElement (String uri, String localName,
    String qName, Attributes attributes) throws SAXException {
    // no op
}

关于由IDEs生成的代码中的super()默认调用,正如@barsju在他的评论中指出的,在每个构造函数中有一个对super()的隐式调用(即使你不在代码中写它)在这种情况下,调用super的默认构造函数。 IDE只是为你编写它,但如果你删除它也会被调用。还要注意,当实现构造函数时,只能在方法的最开始调用具有参数(即super(x,y,z))的super()或其变体。

http://stackoverflow.com/questions/10244785/when-not-to-call-super-method-when-overriding

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 当覆盖时不调用super()方法?